Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何读取带有“CSV”的CSV行;?_Python_Csv - Fatal编程技术网

Python 如何读取带有“CSV”的CSV行;?

Python 如何读取带有“CSV”的CSV行;?,python,csv,Python,Csv,一个微不足道的CSV行可以使用字符串拆分函数吐出。但是有些行可能有“,例如 "good,morning", 100, 300, "1998,5,3" 因此,直接使用字符串拆分并不能解决问题 我的解决方案是首先使用,拆分行,然后在字符串的开头或结尾将字符串与“组合 解决这个问题的最佳做法是什么 我感兴趣的是是否有Python或F#代码片段 编辑:我对实现细节更感兴趣,而不是使用库 Python中有一个模块处理这个问题 编辑:此任务属于“构建lexer”类别。完成这些任务的标准方法是构建一个状态机

一个微不足道的CSV行可以使用字符串拆分函数吐出。但是有些行可能有
,例如

"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:]