异国CSV方言解析

时间:2019-01-10 01:29:23

标签: python-3.x csv parsing

我似乎找不到正确的Python3 CSV阅读器参数来解析该特定CSV方言。生成CSV的事物的行为如下:

解析器信息:

  • 引号:(\ x22)
  • 字段分隔符: ^ (\ x5e)
  • 记录分隔符: \ n (\ x0a)
  • 转义符 \ (\ x5c)

生成此格式的CSV如何工作:

  • 如果在字段中找到指定的记录分隔符,请在字段中加引号
  • 如果在字段中找到指定的字段分隔符,请对该字段加引号。
  • 如果在字段中找到指定的引号字符,请对该字段加引号并转义引号字符
  • 如果在字段中找到指定的转义字符,则不执行任何操作...

^这最后一点是导致我出现问题的原因,因为我特定行的第一个字段以反斜杠结尾。这会导致Python3 CSV解析器将第一个字段分隔符解释为已转义。

参见下文:

(xcve) ttucker@plato:~/tmp/csv$ python --version
Python 3.6.4
(xcve) ttucker@plato:~/tmp/csv$ cat test_csv.py 
import csv
with open('exotic_dialect.csv') as f:
    data = f.readlines()
reader = csv.reader(data, delimiter='^', quotechar='"',
                    escapechar='\\', quoting=csv.QUOTE_MINIMAL)
for row in reader:
    print(row)

(xcve) ttucker@plato:~/tmp/csv$ cat exotic_dialect.csv 
a^b^c
a|^b^c
"a\""^b^c
"a^"^b^c
a\^b^c
(xcve) ttucker@plato:~/tmp/csv$ python test_csv.py 
['a', 'b', 'c']
['a|', 'b', 'c']
['a"', 'b', 'c']
['a^', 'b', 'c']
['a^b', 'c']

^ This last list should have three fields; i.e., ['a\', 'b', 'c']

因此,我的问题是:
  1. 可以使用默认的Python Lib解析此CSV方言吗(但有一些我似乎找不到的特定选项)
  2. 是否可以通过某些python代码轻松地对此进行解析(此外,假设第一个字段以每个可打印的ascii结尾)

2 个答案:

答案 0 :(得分:0)

我不是该领域的专家,但是

1)可能不是。在这种情况下,您期望同一个转义字符可以做两种不同的事情,因此无法区分。这些CSV解析器通常会先转义字符 first

CSV解析器如何确定此示例的正确行为?

  • fo\^o^bar
    • ["fo\","o","bar"]
    • ["fo^o","bar"]

2)我个人将通过一些预处理来运行CSV,以便您可以正确解析文件(将\^替换为\\^

答案 1 :(得分:0)

因此,首先对数据进行字符串替换并不是最好的主意,因为无法在不了解上下文的情况下确定是否应转义未转义的转义字符。我最终只写了自己的解析器。

+