[Python delimiter无法正常工作]

2024-09-30 18:26:36 发布

您现在位置:Python中文网/ 问答频道 /正文

import csv

base='eest1@mail.ru,username1\
test2@gmail.com,username2\
test3@gmail.com,username3\
test4@rambler.ru,username4\
test5@ya.ru,username5'

parsed=csv.reader(base, delimiter=',')
for p in parsed:
    print p

退货:

^{pr2}$

等等。。。在

我怎样才能得到逗号分隔的数据? ('test1@gmail.com测试1@gmail.com','用户名1'), ('test2@gmail.com测试2@gmail.com','用户名2'), ... 在


Tags: csvimportcombaserumailparsedgmail
2条回答

引用official docs on csv moduleemphasis mine):

csv.reader(csvfile, dialect='excel', **fmtparams)

Return a reader object which will iterate over lines in the given csvfile. csvfile can be any object which supports the iterator protocol and returns a string each time its __next__() method is called — file objects and list objects are both suitable.

Strings支持迭代器,但它从字符串中逐个生成字符,而不是多行字符串中的行。在

>>> s = "abcdef"
>>> i = iter(s)
>>> next(i)
'a'
>>> next(i)
'b'
>>> next(i)
'c'

所以任务是创建迭代器,在每次迭代中生成而不是字符。不幸的是,字符串文本不是多行字符串。在

^{pr2}$

相当于:

base = 'eest1@mail.ru,username1test2@gmail.com,username2test3@gmail.com,username3test4@rambler.ru,username4test5@ya.ru,username5

本质上,您没有正确解析该字符串所需的信息。请尝试改用多行字符串文字:

base='''eest1@mail.ru,username1
test2@gmail.com,username2
test3@gmail.com,username3
test4@rambler.ru,username4
test5@ya.ru,username5'''

在此更改之后,您可以按换行符拆分字符串,并且一切正常:

parsed=csv.reader(base.splitlines(), delimiter=',')
for p in parsed:
    print(p)

我认为csv只适用于类似文件的对象。在这种情况下,可以使用StringIO。在

import csv
import StringIO

base='''eest1@mail.ru,username
test2@gmail.com,username2
test3@gmail.com,username3
test4@rambler.ru,username4
test5@ya.ru,username5'''

parsed=csv.reader(StringIO.StringIO(base), delimiter=',')
for p in parsed:
    print p

输出

^{pr2}$

另外,您的示例字符串没有换行符,因此您将得到

['eest1@mail.ru', 'usernametest2@gmail.com', 'username2test3@gmail.com', 'username3test4@rambler.ru', 'username4test5@ya.ru', 'username5']

你可以像我一样使用''',或者改变你的base风格

base='eest1@mail.ru,username\n\
test2@gmail.com,username2\n\
test3@gmail.com,username3\n\
test4@rambler.ru,username4\n\
test5@ya.ru,username5'

编辑
根据文档,参数可以是像objet这样的文件,也可以是列表。所以这个也行

parsed=csv.reader(base.splitlines(), delimiter=',')

相关问题 更多 >