在.csv Python中处理不需要的(独立的)双引号

2024-10-05 13:57:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用Python的csv模块读取格式不正确的.csv文件。 混乱的CSV如下所示:

"name","age","place","date"
"Jack","23","perth, australia","12aug
"Jackie","44","delhi, india","9dec
"Neel","12","austin, texas","1aug
"David","77","fresno, ca","21june

您会注意到,每行末尾(日期列)缺少第二个双引号

当我尝试使用以下代码轻松读取此文件时,我得到:

import csv
import os
temp = csv.reader(open('/Desktop/test csv/quote_test.csv', "r"), delimiter=',')
for row in temp:
    print(row)
['name', 'age', 'place', 'date']
['Jack', '23', 'perth, australia', '12aug\nJackie"', '44', 'delhi, india', '9dec\nNeel"', '12', 'austin, texas', '1aug\nDavid"', '77', 'fresno, ca', '21june']

这是预期的,因为它读取当前行的最后一个元素和下一行的第一个元素(直到找到“匹配最后一个”为止),作为一个条目-跳过所有换行符

我的问题:-有没有更好的方法来处理Python中如此混乱的csv,我们可以为每一行获得至少正确数量的预期列(也就是说,在本例中,有没有方法让Python仍然考虑换行符),然后处理<;“8月12日,12月9日”;等等,分别吗?如果没有,还有什么其他方法可以使用python更好地理解这些数据


Tags: 文件csv方法nameagedateplacejack
3条回答

在将数据传递到csv读取器之前,您可以首先检查行是否以"结尾,如果不存在,则追加"

import csv
import os

with open('/Desktop/test csv/quote_test.csv', "r") as f:
    data = f.read().splitlines()
for i, line in enumerate(data):
    if not line.endswith('"'):
        data[i] = line + '"'      
data = "\n".join(data)
       
temp = csv.reader(data, delimiter=',')
for row in temp:
    print(row)

问题是csv规范明确允许引用的字段包含新行。换句话说,您的文件不是CSV文件,无论配置如何,Python CSV模块都无法处理它

这意味着需要进行预处理。如果您确定除第一行之外的所有行的末尾都缺少双引号,那么您可以在读取标题后始终添加双引号。如果你想更宽容(也许以后的文件会有那个该死的引号),你可以只在行有偶数个引号的情况下添加它(如果一个字段包含引号,它应该加倍)。我将使用一个简单的生成器来修复该文件:

def quote_adder(t):
    for line in t:
        line = line.strip()
        if (len([c for c in line if c == '"']) % 2) != 0:
            line += '"'
        yield line

with open('/Desktop/test csv/quote_test.csv', "r") as fd:
    for row in csv.reader(quote_adder(fd)):
        //process row

如果进程行为print(row),它将按预期给出:

['name', 'age', 'place', 'date']
['Jack', '23', 'perth, australia', '12aug']
['Jackie', '44', 'delhi, india', '9dec']
['Neel', '12', 'austin, texas', '1aug']
['David', '77', 'fresno, ca', '21june']

由于数据格式不好,csv模块很难按照您想要的方式对其进行解析

最好的做法是对文件进行预处理以清理数据。在这种情况下,只需添加缺少的尾随双引号

import csv
import os

with open('/Desktop/test csv/quote_test.csv', 'r') as f:
    data = [f'{line.strip()}"' if not line.strip().endswith('"') else line.strip() for line in f.readlines()]
    temp = csv.reader(data, delimiter=',')
    for row in temp:
        print(row)

注意:这段代码去掉了换行符,以便将双引号附加到行的末尾。新行不是添加回来的(因为它们不是必需的),但是如果需要,您可以轻松地将它们添加回来

相关问题 更多 >

    热门问题