c***y 发帖数: 615 | 1 最近需要自动读入一系列的csv file 进入word 文档,所以在学习python csv module,
做了以下小练习:
目的是读入 csv file, 计算column number, 然后输出每一行的第二列
具体code 和 输出如下:
>>> import csv
>>> with open('test.1.csv','r') as infile:
... text=csv.reader(infile,delimiter=',', quotechar='|')
... fields=len(list(text)[0])
... print fields
... for row in text:
... print row[1]
...
5
这里的5 是column number (fields), 但是我不理解为什么row 的output 没有出来
???
如果我delete 跟fields相关的code,会得到row的output:
>>> with open('test.1.csv','r') as infile:
... text=csv.reader(infile,delimiter=',', quotechar='|')
... for row in text:
... print row[1]
...
year
year2021
year10
难道我需要两次open file吗?
多谢! |
f*******t 发帖数: 7549 | 2 多按一次回车试试?
最好在jupyter notebook里写这种adhoc脚本,有神器别不用。不推荐直接在cmd line
里打代码。 |
g****t 发帖数: 31659 | 3 他这print 看着是python 2。
现在都应该学python 3吧。
: 多按一次回车试试?
: 最好在jupyter notebook里写这种adhoc脚本,有神器别不用。不推荐直接在cmd
line
: 里打代码。
【在 f*******t 的大作中提到】 : 多按一次回车试试? : 最好在jupyter notebook里写这种adhoc脚本,有神器别不用。不推荐直接在cmd line : 里打代码。
|
l*******m 发帖数: 1096 | 4 你的有len那行,把text的generator跑了一次清光了。
:最近需要自动读入一系列的csv file 进入word 文档,所以在学习python csv
module, 做了以下小练习:
: |
g****t 发帖数: 31659 | 5 list清的?我也觉得这里有问题。不过不知道list有这个效果。
: 你的有len那行,把text的generator跑了一次清光了。
: :最近需要自动读入一系列的csv file 进入word 文档,所以在学习python csv
: module, 做了以下小练习:
: :
【在 l*******m 的大作中提到】 : 你的有len那行,把text的generator跑了一次清光了。 : : :最近需要自动读入一系列的csv file 进入word 文档,所以在学习python csv : module, 做了以下小练习: : :
|
s******e 发帖数: 3 | 6 python就是这样,功能很fancy,副作用很无语。这种情况,还不如自己写几行代码
csv
【在 g****t 的大作中提到】 : list清的?我也觉得这里有问题。不过不知道list有这个效果。 : : : 你的有len那行,把text的generator跑了一次清光了。 : : :最近需要自动读入一系列的csv file 进入word 文档,所以在学习python csv : : module, 做了以下小练习: : : : :
|
g****t 发帖数: 31659 | 7 有经验了你会感觉到哪些语法risky,自动就不会那么写了。c和Cpp也都一样。时间长
了不会对语法有多少印象。
: python就是这样,功能很fancy,副作用很无语。这种情况,还不如自己
写几行
代码
: csv
【在 s******e 的大作中提到】 : python就是这样,功能很fancy,副作用很无语。这种情况,还不如自己写几行代码 : : csv
|
s******e 发帖数: 3 | 8 仔细想了一下,好像如你所说。不光是语法,还有那些核心库。又想起那个著名的 c
printf 。
【在 g****t 的大作中提到】 : 有经验了你会感觉到哪些语法risky,自动就不会那么写了。c和Cpp也都一样。时间长 : 了不会对语法有多少印象。 : : : python就是这样,功能很fancy,副作用很无语。这种情况,还不如自己 : 写几行 : 代码 : : csv :
|
f*******t 发帖数: 7549 | 9 还是你看的仔细。我还以为这个csv reader类似于file.readlines()
【在 l*******m 的大作中提到】 : 你的有len那行,把text的generator跑了一次清光了。 : : :最近需要自动读入一系列的csv file 进入word 文档,所以在学习python csv : module, 做了以下小练习: : :
|
c*******v 发帖数: 2599 | 10 python的list刚开始看巨牛无比。后来看,list能造出来的语法糖,数不胜数。
除非只用python一种的,我觉得没法深入钻研。我都是绕着走,能用numpy array就用
numpy。
【在 s******e 的大作中提到】 : 仔细想了一下,好像如你所说。不光是语法,还有那些核心库。又想起那个著名的 c : printf 。
|
|
|
m****s 发帖数: 1 | 11 为什么不用pandas read_csv ?好用的多啊
module,
【在 c***y 的大作中提到】 : 最近需要自动读入一系列的csv file 进入word 文档,所以在学习python csv module, : 做了以下小练习: : 目的是读入 csv file, 计算column number, 然后输出每一行的第二列 : 具体code 和 输出如下: : >>> import csv : >>> with open('test.1.csv','r') as infile: : ... text=csv.reader(infile,delimiter=',', quotechar='|') : ... fields=len(list(text)[0]) : ... print fields : ... for row in text:
|
s*********h 发帖数: 6288 | 12 +1
大多数情况下能解决问题。
看起来楼主像是新用户,先试试read_csv也无妨。
遇到坑了再考虑高阶的就行。
【在 m****s 的大作中提到】 : 为什么不用pandas read_csv ?好用的多啊 : : module,
|
c***y 发帖数: 615 | 13 没太明白这个“generator” 的概念。能再多解释下吗?
的确是python新手,对着Google照猫画虎阶段。。。
【在 l*******m 的大作中提到】 : 你的有len那行,把text的generator跑了一次清光了。 : : :最近需要自动读入一系列的csv file 进入word 文档,所以在学习python csv : module, 做了以下小练习: : :
|
c***y 发帖数: 615 | 14 谢谢推荐。。。
【在 m****s 的大作中提到】 : 为什么不用pandas read_csv ?好用的多啊 : : module,
|
c*******v 发帖数: 2599 | 15 def gen(N):
for i in range(N):
print("counter=",i)
yield i
g1 = gen(6)
这个generator g1包括六个位置,就是那个i 。
next(g1)会返回不同调用时候的i。
关键在于,gen这个函数在其内部,知道它被调用了几次。
但是你用了list(g1),
然后next(g1)会报StopIteration。这个信息就没了。
list的这个作用我也是才知道。
你试着用别的办法,实现一下一个函数内部知道它被调用了几次,
然后print这个次数,可能就理解了。
有了内部可以知道自己被调用多少次的函数,理论上可以用来消除所有的for loop。
这是个数学定理。(我忘了)好象是编译技术早期的一个什么标准型。
【在 c***y 的大作中提到】 : 没太明白这个“generator” 的概念。能再多解释下吗? : 的确是python新手,对着Google照猫画虎阶段。。。
|
N***e 发帖数: 61 | 16 同推荐pandas的read_csv,还有适用范围更广的read_table。CSV文件格式太灵活:有
的有quote,有的quote可以省略,有的用逗号,有的不用(虽然CSV定义是用逗号)。
自己写parser会被折腾死。
yield是为了方便地使用function构造Iterator,就是个语法糖。因为function本身没
有状态变量,不能根据调用次数逐个返回数值,所以就有了yield。在function中使用
yield,调用该function时会返回一个Iterator(generator也是Iterator),这个
Iterator的内部已经根据你的function定义构造好了。其实你完全可以自己写一个
Iterator class。 |
g****t 发帖数: 31659 | 17 List 清generator,其design motivation 是什麼。
: 同推荐pandas的read_csv,还有适用范围更广的read_table。CSV文件格式太灵
活:有
: 的有quote,有的quote可以省略,有的用逗号,有的不用(虽然CSV定义是用逗
号)。
: 自己写parser会被折腾死。
: yield是为了方便地使用function构造Iterator,就是个语法糖。因为function
本身没
: 有状态变量,不能根据调用次数逐个返回数值,所以就有了yield。在function
中使用
: yield,调用该function时会返回一个Iterator(generator也是Iterator),这个
: Iterator的内部已经根据你的function定义构造好了。其实你完全可以自己写一个
: Iterator class。
【在 N***e 的大作中提到】 : 同推荐pandas的read_csv,还有适用范围更广的read_table。CSV文件格式太灵活:有 : 的有quote,有的quote可以省略,有的用逗号,有的不用(虽然CSV定义是用逗号)。 : 自己写parser会被折腾死。 : yield是为了方便地使用function构造Iterator,就是个语法糖。因为function本身没 : 有状态变量,不能根据调用次数逐个返回数值,所以就有了yield。在function中使用 : yield,调用该function时会返回一个Iterator(generator也是Iterator),这个 : Iterator的内部已经根据你的function定义构造好了。其实你完全可以自己写一个 : Iterator class。
|
f*******t 发帖数: 7549 | 18 看文档就知道了。这个reader是一个定义了__next__的object,其实跟文件的readline
差不多,但没有提供reset的功能。list从头next到尾,这个reader就停在最终的状态
了。
【在 g****t 的大作中提到】 : List 清generator,其design motivation 是什麼。 : : : 同推荐pandas的read_csv,还有适用范围更广的read_table。CSV文件格式太灵 : 活:有 : : 的有quote,有的quote可以省略,有的用逗号,有的不用(虽然CSV定义是用逗 : 号)。 : : 自己写parser会被折腾死。 : : yield是为了方便地使用function构造Iterator,就是个语法糖。因为function : 本身没 : : 有状态变量,不能根据调用次数逐个返回数值,所以就有了yield。在function
|
g****t 发帖数: 31659 | 19 我的问题不是其原理。想知道为何如此设计。取舍怎么考虑的。
: 看文档就知道了。这个reader是一个定义了__next__的object,其实跟文
件的
readline
: 差不多,但没有提供reset的功能。list从头next到尾,这个reader就停
在最终
的状态
: 了。
【在 f*******t 的大作中提到】 : 看文档就知道了。这个reader是一个定义了__next__的object,其实跟文件的readline : 差不多,但没有提供reset的功能。list从头next到尾,这个reader就停在最终的状态 : 了。
|
s*********h 发帖数: 6288 | 20 这跟list的design motivation 没关系,
list设计就是从iterable构建列表,做法就是过一遍iterable。
generator是一种iterable,然而只能过一遍。所以list完了之后就关闭了。
function
function
【在 g****t 的大作中提到】 : List 清generator,其design motivation 是什麼。 : : : 同推荐pandas的read_csv,还有适用范围更广的read_table。CSV文件格式太灵 : 活:有 : : 的有quote,有的quote可以省略,有的用逗号,有的不用(虽然CSV定义是用逗 : 号)。 : : 自己写parser会被折腾死。 : : yield是为了方便地使用function构造Iterator,就是个语法糖。因为function : 本身没 : : 有状态变量,不能根据调用次数逐个返回数值,所以就有了yield。在function
|
|
|
l*******m 发帖数: 1096 | 21 list要在内存放所有对象的。generator是pipeline, 遍历时自己本身是不保存对象。
所以generator可以是无限的,也不会有oom
:我的问题不是其原理。想知道为何如此设计。取舍怎么考虑的。
: |
c***y 发帖数: 615 | 22 感觉这个csv.reader return了一个比较特别的object |
g*****g 发帖数: 390 | 23 现在好多python function都改成generator了,主要是为了省内存吧,挺好用的,简单
举例:
[i for i in range(5)]
=> will give you a list [0,1,2,3,4], every element
is created and stored in memory, readily available.
on the other hand, below code (replace [...] with (...)) will give you
a very simple generator, note [...] is same as list(...), in python:
(i for i in range(5))
=> give you a sequence of 0,1,2,3,4, you can iterate
thru it "one by one" by either next() function or much more commonly a for
loop, or list comprehension which is my favorite. Key difference here is
next element in a
generator is not created until you requested. Say you have a huge list,
saving can be significant.
正在学python,瞎说一下,个人非常喜欢list,尤其是list comprehension,功能太强
大了,一行代码就可以把一个nested dict flatten,比如:
{"first":{"a":1}, "second":{"b":2}}
to:
["first", "a", 1, "second", "b", 2]
正常需要两个for loop
To show what a list comprehension can do::
[i**2 for i in range(10) if i !=2 if i !=5]
=> will generate square of 0 to 9 but skip 2 and 5 for me:
[0, 1, 9, 16, 36, 49, 64, 81]
where:
- range(10) can be any data source (a list type usually or a generator, but
a
2D array is fine as well I believe
- I used two "if"s to show I can add two conditions very easily
- where **2 being used, I can easily incorporate a lambda
function. |
d********g 发帖数: 10550 | 24 还为了配合asyncio生态
【在 g*****g 的大作中提到】 : 现在好多python function都改成generator了,主要是为了省内存吧,挺好用的,简单 : 举例: : [i for i in range(5)] : => will give you a list [0,1,2,3,4], every element : is created and stored in memory, readily available. : on the other hand, below code (replace [...] with (...)) will give you : a very simple generator, note [...] is same as list(...), in python: : (i for i in range(5)) : => give you a sequence of 0,1,2,3,4, you can iterate : thru it "one by one" by either next() function or much more commonly a for
|
N***e 发帖数: 61 | 25 comprehension 和literal 好用是优点也是缺点。而且大部分都是情况下都是缺点。
你说的例子我好像在网上看过,比如前两个就是缺点的体现。
[i for i in range(5)]不需要用所谓的list comprehension写成list(range(5))简洁
而且效率高。
(i for i in range(5))不要这样写。用range(5)就可以了。另外用()作为generator的
literal在我看来是个大bug。圆括号在python里的含义太多了,加圆括号要格外小心。
[i**2 for i in range(10) if i !=2 if i !=5] 这个是list comprehension的优点,
简洁可读性强,比用map和filter加lambda好。
其他语言也不差:
* 不用强制,可以多行写成一行,所以不需要comprehension;JavaScript更是可以
IIFE
* 可以chain function,这样用map,filter,lambda看上去也不差
最后一个例子用Java也是一行:
List l = IntStream.range(0, 10).filter(i -> i != 2 && i != 5).map(i
-> i * i).boxed().collect(Collectors.toList());
这个比Python繁琐,是因为生成list分成好多步,List也有好多种。Java需要知道List
的和List中内容的类型。Python直接把这些都封装了。
【在 g*****g 的大作中提到】 : 现在好多python function都改成generator了,主要是为了省内存吧,挺好用的,简单 : 举例: : [i for i in range(5)] : => will give you a list [0,1,2,3,4], every element : is created and stored in memory, readily available. : on the other hand, below code (replace [...] with (...)) will give you : a very simple generator, note [...] is same as list(...), in python: : (i for i in range(5)) : => give you a sequence of 0,1,2,3,4, you can iterate : thru it "one by one" by either next() function or much more commonly a for
|
g*****g 发帖数: 390 | 26 你说的都对,我的例子都是简单的例子,为了证明我的论点而已,没有必要那样写。而
且我现在闭门造车,也没有地方让我这么写python。我正在学python,也不会Java。我
就是觉得好玩,比如先把dictionary 一行代码flatten。再把nested dictionary 用一
行flatten,这个花了我半天时间才搞定。用for loop多简单啊,完全没必要。
【在 N***e 的大作中提到】 : comprehension 和literal 好用是优点也是缺点。而且大部分都是情况下都是缺点。 : 你说的例子我好像在网上看过,比如前两个就是缺点的体现。 : [i for i in range(5)]不需要用所谓的list comprehension写成list(range(5))简洁 : 而且效率高。 : (i for i in range(5))不要这样写。用range(5)就可以了。另外用()作为generator的 : literal在我看来是个大bug。圆括号在python里的含义太多了,加圆括号要格外小心。 : [i**2 for i in range(10) if i !=2 if i !=5] 这个是list comprehension的优点, : 简洁可读性强,比用map和filter加lambda好。 : 其他语言也不差: : * 不用强制,可以多行写成一行,所以不需要comprehension;JavaScript更是可以
|
g*****g 发帖数: 390 | 27 看过一点coroutine,好难,功力远远不够
【在 d********g 的大作中提到】 : 还为了配合asyncio生态
|
d********g 发帖数: 10550 | 28 还好吧,Python asyncio最成功的地方在于sync/async两种语法最后写出来差不多,不
需要切换习惯
相比JavaScript,callback一种写法,promise一种写法,async/await又一种写法(殊
途同归,最后这个进化得和Python asyncio几乎一样),各个时期的代码太乱了,三种
都需要会
Python甚至还有asgiref懒人包,如果legacy代码是sync的,一个sync_to_async()
decorator就能简单粗暴给包成async兼容(虽然效率不如原生async)。反过来也有
async_to_sync():
https://github.com/django/asgiref
【在 g*****g 的大作中提到】 : 看过一点coroutine,好难,功力远远不够
|
r****t 发帖数: 10904 | 29 省内存。不清generator的也很容易,itertools里面有个repeat可以变成不清的。
function
function
【在 g****t 的大作中提到】 : List 清generator,其design motivation 是什麼。 : : : 同推荐pandas的read_csv,还有适用范围更广的read_table。CSV文件格式太灵 : 活:有 : : 的有quote,有的quote可以省略,有的用逗号,有的不用(虽然CSV定义是用逗 : 号)。 : : 自己写parser会被折腾死。 : : yield是为了方便地使用function构造Iterator,就是个语法糖。因为function : 本身没 : : 有状态变量,不能根据调用次数逐个返回数值,所以就有了yield。在function
|
n******t 发帖数: 4406 | 30 python的確簡單好學。但是我是不知道你爲啥覺得你這幾個例子別人語言要10幾行。。
【在 g*****g 的大作中提到】 : 现在好多python function都改成generator了,主要是为了省内存吧,挺好用的,简单 : 举例: : [i for i in range(5)] : => will give you a list [0,1,2,3,4], every element : is created and stored in memory, readily available. : on the other hand, below code (replace [...] with (...)) will give you : a very simple generator, note [...] is same as list(...), in python: : (i for i in range(5)) : => give you a sequence of 0,1,2,3,4, you can iterate : thru it "one by one" by either next() function or much more commonly a for
|
|
|
c*******v 发帖数: 2599 | 31 就算十几行,存在emacs/vim里,常用语法
一个快捷键就出来了。
【在 n******t 的大作中提到】 : python的確簡單好學。但是我是不知道你爲啥覺得你這幾個例子別人語言要10幾行。。
|
n******t 发帖数: 4406 | 32 這都不算,就是直接打字,就他的那幾個循環不就是4行麼?有兩行還只有兩個括號。
而且一旦這個循環裏面要搞點別的什麼奇怪的事情:諸如寫點磁盤,讀點socket,處理
點異常什麼的,他那個立刻就沒用了,然後就是在那里冥思苦想一個1或者2行的方案,
結果時間早就過去了。
我覺得很多人寫很多code,但是在比較的時候常常是感情爲主,數據爲輔。
其實號稱最簡練的K,APL之類的語言,要達到1/10都不是那麼容易的。而且1/10的行數
和1/10的時間是兩回事。我早說了,打字不是coding的bottleneck,如果是,這些
coder都要被客服小妹團滅。
【在 c*******v 的大作中提到】 : 就算十几行,存在emacs/vim里,常用语法 : 一个快捷键就出来了。
|
g*****g 发帖数: 390 | 33 乱说的,已改,我除了python就用fortran,Matlab,和VB编过大一点的程序,
所以乱说的,无意引起争论。
【在 n******t 的大作中提到】 : python的確簡單好學。但是我是不知道你爲啥覺得你這幾個例子別人語言要10幾行。。
|
g*****g 发帖数: 390 | 34 多谢指教,我正在学python,还没有编过什么大东西,看了一点flask,还没接触
Django。
我是想转data science方向。
【在 d********g 的大作中提到】 : 还好吧,Python asyncio最成功的地方在于sync/async两种语法最后写出来差不多,不 : 需要切换习惯 : 相比JavaScript,callback一种写法,promise一种写法,async/await又一种写法(殊 : 途同归,最后这个进化得和Python asyncio几乎一样),各个时期的代码太乱了,三种 : 都需要会 : Python甚至还有asgiref懒人包,如果legacy代码是sync的,一个sync_to_async() : decorator就能简单粗暴给包成async兼容(虽然效率不如原生async)。反过来也有 : async_to_sync(): : https://github.com/django/asgiref
|
g*****g 发帖数: 390 | 35 感觉itertools里面cycle更象你想说的,可以一直循环下去,纯讨论
【在 r****t 的大作中提到】 : 省内存。不清generator的也很容易,itertools里面有个repeat可以变成不清的。 : : function : function
|
r****t 发帖数: 10904 | 36 该是吧,这一年没有写很多python, 不记得喽。
【在 g*****g 的大作中提到】 : 感觉itertools里面cycle更象你想说的,可以一直循环下去,纯讨论
|
z*******g 发帖数: 1 | 37 用Pandas对付csv。Python的优势就是生态资源丰富,别人开发好的工具多,不要浪费
了这个优势
module,
【在 c***y 的大作中提到】 : 最近需要自动读入一系列的csv file 进入word 文档,所以在学习python csv module, : 做了以下小练习: : 目的是读入 csv file, 计算column number, 然后输出每一行的第二列 : 具体code 和 输出如下: : >>> import csv : >>> with open('test.1.csv','r') as infile: : ... text=csv.reader(infile,delimiter=',', quotechar='|') : ... fields=len(list(text)[0]) : ... print fields : ... for row in text:
|