Python 如何读取带有“CSV”的CSV行;?
一个微不足道的CSV行可以使用字符串拆分函数吐出。但是有些行可能有Python 如何读取带有“CSV”的CSV行;?,python,csv,Python,Csv,一个微不足道的CSV行可以使用字符串拆分函数吐出。但是有些行可能有“,例如 "good,morning", 100, 300, "1998,5,3" 因此,直接使用字符串拆分并不能解决问题 我的解决方案是首先使用,拆分行,然后在字符串的开头或结尾将字符串与“组合 解决这个问题的最佳做法是什么 我感兴趣的是是否有Python或F#代码片段 编辑:我对实现细节更感兴趣,而不是使用库 Python中有一个模块处理这个问题 编辑:此任务属于“构建lexer”类别。完成这些任务的标准方法是构建一个状态机
“
,例如
"good,morning", 100, 300, "1998,5,3"
因此,直接使用字符串拆分并不能解决问题
我的解决方案是首先使用,
拆分行,然后在字符串的开头或结尾将字符串与“
组合
解决这个问题的最佳做法是什么
我感兴趣的是是否有Python或F#代码片段
编辑:我对实现细节更感兴趣,而不是使用库 Python中有一个模块处理这个问题
编辑:此任务属于“构建lexer”类别。完成这些任务的标准方法是构建一个状态机(或者使用一个lexer库/框架来为您完成这项任务)
此任务的状态机可能只需要两个状态:
- 第一个,它读取除逗号和换行符以外的所有字符作为字段的一部分(例外:前导和尾随空格),逗号作为字段分隔符,换行符作为记录分隔符。当它遇到开场白时,它进入
- 读引号字段状态,其中除引号外的每个字符(包括逗号和换行符)都被视为字段的一部分,引号后不加引号表示读引号字段的结束(返回初始状态),引号后加引号被视为单引号(转义引号)
“Field1”、“Field2”或“Field1”、“Field2”上从以下位置断开:
读取普通CSV文件:
import csv
reader = csv.reader(open("some.csv", "rb"))
for row in reader:
print row
读取具有备用格式的文件:
import csv
reader = csv.reader(open("passwd", "rb"), delimiter=':', quoting=csv.QUOTE_NONE)
for row in reader:
print row
有一些
如果您对细节感兴趣,请阅读“显示一些与此问题相关的好的正则表达式,或者简单地阅读CSV模块源。
< P>编程的第4章给出了CSV解析器的C和C++实现。 < P>通用实现细节将是类似于此的(未测试)
与大多数解析问题一样,如果存在库,则使用库是一种更可持续的做法。如果OP真的对实现感兴趣,我相信Python库是开源的。它是完全开放的,并且已经安装了Python。实际上,在Python开源中查看CSV模块的建议要好得多。我真傻。
def csvline2fields(line):
fields = []
quote = None
while line.strip():
line = line.strip()
if line[0] in ("'", '"'):
# Find the next quote:
end = line.find(line[0])
fields.append(line[1:end])
# Find the beginning of the next field
next = line.find(SEPARATOR)
if next == -1:
break
line = line[next+1:]
continue
# find the next separator:
next = line.find(SEPARATOR)
fields.append(line[0:next])
line = line[next+1:]