由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - python code help: 读入csv file的bug
相关主题
istream_iterator问题c++ iterator 弱问
how to read a sentence into a vector of string?c++ template question:
有没有类似strtok的函数请问Linux底下有没有最简易的show 2D x-y curve的工具
问一段C++ iostringstream的代码用那个design pattern好?
一个C++的概念问题关于inserter
intel icc hash_map 求救!binary_search只要求forward_iterator?
STL感觉实在太变态了deque的pointer和reference是怎么回事?
[菜鸟问题]类模板问题a question about std::stack
相关话题的讨论汇总
话题: csv话题: list话题: python话题: generator话题: function
进入Programming版参与讨论
1 (共1页)
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 。

相关主题
STL感觉实在太变态了c++ template question:
[菜鸟问题]类模板问题请问Linux底下有没有最简易的show 2D x-y curve的工具
c++ iterator 弱问用那个design pattern好?
进入Programming版参与讨论
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

相关主题
关于insertera question about std::stack
binary_search只要求forward_iterator?呼唤大侠们,我实在不能实现C++泛型的精神。
deque的pointer和reference是怎么回事?stl 的 member type 看起来挺头大的
进入Programming版参与讨论
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

相关主题
how to write a function take iterators as parameters?how to read a sentence into a vector of string?
c++ interview: iterator 和 pointer区别?有没有类似strtok的函数
istream_iterator问题问一段C++ iostringstream的代码
进入Programming版参与讨论
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:

1 (共1页)
进入Programming版参与讨论
相关主题
呼唤大侠们,我实在不能实现C++泛型的精神。一个C++的概念问题
stl 的 member type 看起来挺头大的intel icc hash_map 求救!
how to write a function take iterators as parameters?STL感觉实在太变态了
c++ interview: iterator 和 pointer区别?[菜鸟问题]类模板问题
istream_iterator问题c++ iterator 弱问
how to read a sentence into a vector of string?c++ template question:
有没有类似strtok的函数请问Linux底下有没有最简易的show 2D x-y curve的工具
问一段C++ iostringstream的代码用那个design pattern好?
相关话题的讨论汇总
话题: csv话题: list话题: python话题: generator话题: function