【发布时间】:2011-03-19 08:50:30
【问题描述】:
有人知道一个简单的库或函数来解析 csv 编码的字符串并将其转换为数组或字典吗?
我不认为我想要内置的 csv module,因为在我看到的所有示例中,都使用文件路径,而不是字符串。
【问题讨论】:
有人知道一个简单的库或函数来解析 csv 编码的字符串并将其转换为数组或字典吗?
我不认为我想要内置的 csv module,因为在我看到的所有示例中,都使用文件路径,而不是字符串。
【问题讨论】:
不是通用 CSV 解析器,但可用于带有逗号的简单字符串。
>>> a = "1,2"
>>> a
'1,2'
>>> b = a.split(",")
>>> b
['1', '2']
解析 CSV 文件:
f = open(file.csv, "r")
lines = f.read().split("\n") # "\r\n" if needed
for line in lines:
if line != "": # add other needed checks to skip titles
cols = line.split(",")
print cols
【讨论】:
3, "4,5,6, 6 应被视为三个字段而不是五个字段。
您可以使用io.StringIO 将字符串转换为文件对象,然后将其传递给csv 模块:
from io import StringIO
import csv
scsv = """text,with,Polish,non-Latin,letters
1,2,3,4,5,6
a,b,c,d,e,f
gęś,zółty,wąż,idzie,wąską,dróżką,
"""
f = StringIO(scsv)
reader = csv.reader(f, delimiter=',')
for row in reader:
print('\t'.join(row))
在换行符上带有split() 的更简单版本:
reader = csv.reader(scsv.split('\n'), delimiter=',')
for row in reader:
print('\t'.join(row))
或者你可以简单地将split()这个字符串分成几行,使用\n作为分隔符,然后split()每一行变成值,但是这样你必须注意引用,所以最好使用csv模块。
在 Python 2 上,您必须将 StringIO 导入为
from StringIO import StringIO
改为。
【讨论】:
.split('\n'),而不是.splitlines()。
虽然该模块不直接支持解析字符串,但可以轻松完成:
import csv
for row in csv.reader(['one,two,three']):
print row
只需将您的字符串转换为单个元素列表。
当这个示例在文档中明确显示时,导入 StringIO 对我来说似乎有点过分。
【讨论】:
csv.reader()https://docs.python.org/2/library/csv.html 的官方文档非常有帮助,上面写着
文件对象和列表对象都合适
import csv
text = """1,2,3
a,b,c
d,e,f"""
lines = text.splitlines()
reader = csv.reader(lines, delimiter=',')
for row in reader:
print('\t'.join(row))
【讨论】:
使用它来将 csv 加载到列表中
import csv
csvfile = open(myfile, 'r')
reader = csv.reader(csvfile, delimiter='\t')
my_list = list(reader)
print my_list
>>>[['1st_line', '0'],
['2nd_line', '0']]
【讨论】:
这里有一个替代解决方案:
>>> import pyexcel as pe
>>> text="""1,2,3
... a,b,c
... d,e,f"""
>>> s = pe.load_from_memory('csv', text)
>>> s
Sheet Name: csv
+---+---+---+
| 1 | 2 | 3 |
+---+---+---+
| a | b | c |
+---+---+---+
| d | e | f |
+---+---+---+
>>> s.to_array()
[[u'1', u'2', u'3'], [u'a', u'b', u'c'], [u'd', u'e', u'f']]
【讨论】:
https://docs.python.org/2/library/csv.html?highlight=csv#csv.reader
csvfile 可以是任何支持迭代器协议并且每次调用 next() 方法时返回一个字符串的对象
因此,StringIO.StringIO()、str.splitlines() 甚至是生成器都很好。
【讨论】:
正如其他人已经指出的那样,Python 包含一个用于读取和写入 CSV 文件的模块。只要输入字符保持在 ASCII 限制范围内,它就可以很好地工作。如果您想处理其他编码,则需要做更多的工作。
Python documentation for the csv module 实现了 csv.reader 的扩展,它使用相同的接口但可以处理其他编码并返回 unicode 字符串。只需复制并粘贴文档中的代码即可。之后,您可以像这样处理 CSV 文件:
with open("some.csv", "rb") as csvFile:
for row in UnicodeReader(csvFile, encoding="iso-8859-15"):
print row
【讨论】:
'utf-8-sig' 作为编解码器而不是 'utf-8' .
简单 - csv 模块也适用于列表:
>>> a=["1,2,3","4,5,6"] # or a = "1,2,3\n4,5,6".split('\n')
>>> import csv
>>> x = csv.reader(a)
>>> list(x)
[['1', '2', '3'], ['4', '5', '6']]
【讨论】:
.split('\n') 会做一些奇怪的事情。