我正在编写一个Python实用程序,需要解析一个我无法控制的大型,定期更新的CSV文件.该实用程序必须在只有Python 2.4可用的服务器上运行.CSV文件根本不引用字段值,但csv库的Python 2.4版本似乎没有给我任何关闭引用的方法,它只允许我设置引号字符(dialect.quotechar = '"'或其他).如果我尝试将引号字符设置为None空字符串,则会出现错误.
我可以通过设置dialect.quotechar一些"稀有"字符来解决这个问题,但这很脆弱,因为没有ASCII字符我绝对可以保证不会出现在字段值中(除了分隔符,但如果我设置dialect.quotechar = dialect.delimiter,那么事情就会发生)可以预见的乱七八糟的.
在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
Run Code Online (Sandbox Code Playgroud)
只有在行的最后一列中有一个双引号字符时才会出现此问题.不幸的是,我的数据集中存在这种情况.我接受了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']
Run Code Online (Sandbox Code Playgroud)
在Python 2.5+设置中引用csv.QUOTE_NONE就足够了,那么值quotechar就无关紧要了.(我实际上通过a获取我的初始方言csv.Sniffer然后覆盖quotechar值,而不是通过子类化csv.Dialect,但我不希望这会分散真正的问题;上面两个会话证明这Sniffer不是问题. )
| 归档时间: |
|
| 查看次数: |
10478 次 |
| 最近记录: |