![](/img/trans.png)
[英]csv.reader () - How can I extract columns from a csv.reader object?
[英]How can I disable quoting in the Python 2.4 CSV reader?
我正在编写一个Python实用程序,需要解析一个我无法控制的大型,定期更新的CSV文件。 该实用程序必须在只有Python 2.4可用的服务器上运行。 CSV文件根本不引用字段值,但csv库的Python 2.4版本似乎没有给我任何关闭引用的方法,它只允许我设置引号字符( dialect.quotechar = '"'
如果我尝试将引号字符设置为None
或空字符串,我会收到错误。
我可以通过将dialect.quotechar
设置为一些“稀有”字符来解决这个问题,但这很脆弱,因为没有ASCII字符我绝对可以保证不会出现在字段值中(除了分隔符,但是如果我设置的话) dialect.quotechar = dialect.delimiter
,事情可以预测为haywire)。
在Python的2.5或更高版本 ,如果我设置dialect.quoting
到csv.QUOTE_NONE
的CSV读者尊重这一点,不解释任何字符作为引号字符。 有没有办法在Python 2.4中复制此行为?
更新 :感谢Triptych和Mark Roddy帮助缩小问题范围。 这是一个最简单的案例演示:
>>> import csv
>>> import StringIO
>>> data = """
... 1,2,3,4,"5
... 1,2,3,4,5
... """
>>> reader = csv.reader(StringIO.StringIO(data))
>>> for i in reader: print i
...
[]
Traceback (most recent call last):
File "<stdin>", line 1, in ?
_csv.Error: newline inside string
只有在行的最后一列中有一个双引号字符时才会出现此问题。 不幸的是,我的数据集中存在这种情况。 我接受了Tanj的解决方案:手动指定一个非打印字符( "\\x07"
或BEL
)作为quotechar。 这很hacky,但它确实有效,我还没有看到另一个解决方案。 以下是该解决方案的演示:
>>> import csv
>>> import StringIO
>>> class MyDialect(csv.Dialect):
... quotechar = '\x07'
... delimiter = ','
... lineterminator = '\n'
... doublequote = False
... skipinitialspace = False
... quoting = csv.QUOTE_NONE
... escapechar = '\\'
...
>>> dialect = MyDialect()
>>> data = """
... 1,2,3,4,"5
... 1,2,3,4,5
... """
>>> reader = csv.reader(StringIO.StringIO(data), dialect=dialect)
>>> for i in reader: print i
...
[]
['1', '2', '3', '4', '"5']
['1', '2', '3', '4', '5']
在Python 2.5+设置中引用csv.QUOTE_NONE就足够了,而quotechar
的值则无关紧要。 (我实际上通过csv.Sniffer
获取我的初始方言,然后覆盖quotechar值,而不是通过csv.Dialect
,但我不希望这会分散真正的问题;以上两个会话证明了Sniffer
器不是问题。)
我不知道python是否愿意/允许它,但你可以使用不可打印的ascii代码,如BEL或BS(退格)这些我认为是非常罕见的。
我尝试了一些使用Python 2.4.3的例子,它似乎很聪明,可以检测到字段是否未引用。
我知道你已经接受了一个(稍微有些hacky)的答案,但你是否尝试过仅仅将reader.dialect.quotechar
值留下来? 如果你这样做会怎么样?
我们有机会获得实例输入吗?
为Triptych +1
确认csv.reader自动处理带引号的csv文件:
>>> import StringIO
>>> import csv
>>> data="""
... 1,2,3,4,5
... 1,2,3,4,5
... 1,2,3,4,5
... """
>>> reader=csv.reader(StringIO.StringIO(data))
>>> for i in reader:
... print i
...
[]
['1', '2', '3', '4', '5']
['1', '2', '3', '4', '5']
['1', '2', '3', '4', '5']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.