CSV分隔符无法正常工作[Python]

时间:2016-09-04 07:27:48

标签: python csv

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

返回:

['e']
['e']
['s']
['t']
['1']
['@']
['m']
['a']
['i']
['l']
['.']
['r']
['u']
['', ''] 

等...

如何用逗号分隔数据? ('test1@gmail.com','username1'), ('test2@gmail.com','username2'), ...

2 个答案:

答案 0 :(得分:2)

我认为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

输出

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

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

['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'

修改
根据文档,参数可以是类似文件的对象或列表。所以这也有效

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

答案 1 :(得分:1)

引用official docs on csv module强调我的):

  

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

     

返回一个读取器对象,它将迭代给定的行   csvfile csvfile可以是支持迭代器的任何对象   协议并在每次__next__()方法时返回一个字符串   被叫 - 文件对象和列表对象都是合适的。

字符串支持迭代器,但它从字符串逐个产生字符,而不是来自多行字符串的行。

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

因此,任务是创建迭代器,在每次迭代时都会产生而不是字符。不幸的是,您的字符串文字不是多行字符串。

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

相当于:

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)