pandas读取在列中带有额外逗号的csv

c7rzv4ha  于 2023-04-27  发布在  其他
关注(0)|答案(5)|浏览(168)

我正在阅读一个基本的csv文件,其中的列用逗号分隔,列名称如下:
userid, username, body
然而,body列是一个可能包含逗号的字符串。显然这会导致一个问题,pandas会抛出一个错误:
CParserError: Error tokenizing data. C error: Expected 3 fields in line 3, saw 8
有没有一种方法可以告诉pandas忽略特定列中的逗号,或者有没有一种方法可以解决这个问题?

7ajki6be

7ajki6be1#

假设我们正在阅读名为comma.csv的 Dataframe :

userid, username, body
01, n1, 'string1, string2'

您可以做的一件事是指定列中字符串的分隔符:

df = pd.read_csv('comma.csv', quotechar="'")

在这种情况下,由'分隔的字符串被认为是total,无论它们内部是否有逗号。

nhhxz33t

nhhxz33t2#

将usecols和linetimator添加到read_csv()函数中,其中n是列的len。
在我的例子中:

n = 5 #define yours
df = pd.read_csv(file,
                 usecols=range(n),
                 lineterminator='\n',
                 header=None)
4si2a6ki

4si2a6ki3#

对我来说,上面的代码示例都不起作用(我在Kaggle上处理Netflix Prize数据集),但实际上pandas版本1.3.0+有一个很酷的功能,它是一个on_bad_lines参数,可以让你使用回调函数。下面是我所做的:

def manual_separation(bad_line):
    right_split = bad_line[:-2] + [",".join(bad_line[-2:])] # All the "bad lines" where all coming from the same last column that was containing ","
    return right_split

filename = "netflix_movie_titles.csv"
df = pd.read_csv(
        filename, 
        header=None,
        encoding="ISO-8859-1",
        names = ['Movie_Id', 'Year', 'Name'], 
        on_bad_lines=manual_separation,
        engine="python",
    )

工作起来很有魅力!你唯一的义务就是使用engine=python。希望对你有帮助!

wvmv3b1j

wvmv3b1j4#

这个有用吗

import csv
with open("csv_with_commas.csv", newline='', encoding = 'utf8') as f:
    csvread = csv.reader(f)
    batch_data = list(csvread)
    print(batch_data)

参考文献:
[1][https://stackoverflow.com/a/40477760/6907424](https://stackoverflow.com/a/40477760/6907424)
[2]为了解决“UnicodeDecodeError:“charmap”编解码器无法解码位置157中的字节0x8f:字符Map到undefined”:https://stackoverflow.com/a/9233174/6907424

t9aqgxwy

t9aqgxwy5#

首先,我没有找到任何东西来解决“comma inside qoutes,issue”系统和正确。pandas=1.5.3无法正确解析它。尝试指定参数,如qoutechar,quoting,escapechar,linetimator,...
最后,利用我知道逗号只能在最后一列的优势,找到了两个变通的解决方案

userid, username, body
1, Joe, string1
2, Jim, "string21, string22"

如果您不介意第三个逗号后的部分丢失,请指定列数

pd.read_csv(r'c:\TEMP\to_parse.csv',usecols=range(3))

从而产生

userid  username        body
0       1       Joe     string1
1       2       Jim   "string21

第二种解决方法更复杂,但它会产生带逗号的完整字符串。原理是用分号替换前2个逗号(您必须知道列数)

with open(path, 'r') as f:
    fo = io.StringIO()
    data = f.readlines()
    fo.writelines(u"" + line.replace(';', ':').replace(',', ';', 2) for line in data)
    fo.seek(0)
df = pd.read_csv(fo, on_bad_lines='warn', sep=';')

也许它也可以通过regex来实现。

相关问题