使用python解析CSV

5rgfhyps  于 2023-03-10  发布在  Python
关注(0)|答案(3)|浏览(175)

我有一个CSV文件,其中一行是:

Value1|Due Date: 01/01/2000  \|||Value5

预期结果:

FieldName1|FieldName2             |FieldName3|Fieldname4|FieldName5

Value1    |Due Date: 01/01/2000   |          |          |Value5

实际结果:

FieldName1|FieldName2               |FieldName3|Fieldname4|FieldName5

"Value1"  |"Due Date: 01/01/2000  |"|""        |"Value5"

我用下面的代码来阅读它:reader = csv.reader(infile, delimiter = '|', doublequote = False, escapechar = '\\')由于转义字符,它将第二个字段后面的列分隔符作为第二个字段的一部分进行解析,并忽略下一个空字段(field3)。
我的代码:

reader = csv.reader(infile, delimiter = '|', doublequote = False, escapechar = '\\')
writer = csv.writer(outfile, delimiter = '|', quoting = csv.QUOTE_ALL)

我应该如何设置阅读器?或者我应该在阅读文件之前删除反斜杠?你有其他的想法吗?

nhaq1z21

nhaq1z211#

escapechar定义Dialect,它从来没有出现在你的文件中,我建议你尝试使用NUL,让file.csv的内容

1|||2|||3
4|||5\|||6
7|||8|||9

那么

import csv
class MyDialect(csv.Dialect):
    delimiter = '|'
    escapechar = '\x00'
    lineterminator = '\r\n'
    quoting = csv.QUOTE_NONE
with open('file.csv', newline='') as f:
    reader = csv.reader(f, dialect=MyDialect)
    for row in reader:
        print(row)

给出输出

['1', '', '', '2', '', '', '3']
['4', '', '', '5\\', '', '', '6']
['7', '', '', '8', '', '', '9']

注意,\需要转义以获得文本\,从而获得\\

smtd7mpg

smtd7mpg2#

你太复杂了,让csv模块以最小的干扰完成它的工作:

cat escape.csv
Value1|Due Date: 01/01/2000  \|||Value5

import csv

with open('escape.csv', newline='') as csv_file:
    cR = csv.reader(csv_file, delimiter='|')
    for row in cR:
        print(row)

['Value1', 'Due Date: 01/01/2000  \\', '', '', 'Value5']

fld_names = ["FieldName1", "FieldName2", "FieldName3", "Fieldname4", "FieldName5"]
with open('out_escape.csv', 'w', newline='') as out_file:
    cW = csv.writer(out_file, delimiter='|')
    cW.writerow(fld_names)
    cW.writerow(['Value1', 'Due Date: 01/01/2000  \\', '', '', 'Value5'])

cat out_escape.csv
FieldName1|FieldName2|FieldName3|Fieldname4|FieldName5
Value1|Due Date: 01/01/2000  \|||Value5
6fe3ivhb

6fe3ivhb3#

在标准字符串中键入\\时,python将存储一个 single 反斜杠

这意味着你将转义字符定义为一个反斜杠,Python因此阅读:

\|

是为了逃避“|“字符,即使其成为(前面的)字符串的一部分,而不是分隔符。
因为没有什么特别的含义,它默认回被解释为正常“|“字符:日期末尾的那个,因此Python正确地运行了你给它的指令。

根据您的预期,我认为您希望删除\

如果是这种情况,只需将\替换为空字符串。

s = s.replace(r"\","")

相关问题