使用 python 和 pandas 将错误创建的大型 csv 文件转换为制表符分隔文件

Posted

技术标签:

【中文标题】使用 python 和 pandas 将错误创建的大型 csv 文件转换为制表符分隔文件【英文标题】:Converting a large wrongly created csv file into a tab delimited file using python and pandas 【发布时间】:2017-05-21 16:33:30 【问题描述】:

我有一个非常大的 csv 文件(>3GB,> 7500 万行)。 问题是,它不应该被创建为 csv,而是制表符分隔。 该文件有两列,一个字符串和一个整数。但是,字符串可以有逗号(例如:“是的,它非常好”),所以,现在文件可能看起来像这样,并且它没有一致的列数,我无法使用 pandas read_csv 读取它。

STRING                    CODE      
This is nice                1       
That is also nice           2       
Yes                  it is very nice    3   
I love everything           4

我正在尝试通过将最后一个逗号更改为制表符来将其转换为制表符分隔文件。由于文件很大,我无法将其读入内存。这是我尝试过的。 我分块读取文件:

for ch in pandas.read_table("path", chunksize=256)

我定义了一个函数myfunc,如下:

li = s.rsplit(",", 1)
ret = "\t".join(li)
ret.rsplit("\t", 1)

现在,对于每个块,我会执行以下操作:

data["STRING,CODE"] = data["STRING,CODE"].map(lambda x: x.myfunc(x))
data.to_csv("tmp.csv", sep="\t")

我得到类似的东西:

     STRING                                 CODE
0   "This is nice   1   
1   "That is also nice      
2   "Yes                                it is very nice 3"
3   "I love everything  4"

这与我想要的完全不同。条目没有按照我想要的方式分隔,我得到额外的索引和额外的引号。此外,即使在我能够修复一个块之后,我也需要返回并附加到 csv 文件以重新创建整个文件。 对不起,这很混乱,但我迷路了。有什么帮助吗?

文件:

STRING,CODE
This is nice,1
That is also nice,2
Yes,it is very nice,3
I love everything,4

【问题讨论】:

您能否从您拥有的实际文件(包括这些问题之一)中发布一个 sn-p 以及您期望的输出是什么?这样我们就不必猜测解决方案是否会处理您的(部分)数据。 这不是我做的吗?我发布的示例显示了这个问题,第三个字符串中有一个逗号,因此,当它保存为 csv 文件时,该字符串现在被分成两列,代码被移动到第三列。我想将其移动为制表符分隔的文件,以便字符串中的逗号不会影响文件。如果这不能回答您的问题,请告诉我。谢谢! 不是真正的熊猫问题。 您的参考是错误解析文件的示例,而不是文件本身。文件本身将具有用逗号分隔的字段。这不是无法解决的问题,但是如果您希望人们测试他们的答案,那么您越容易做到这一点,他们就越有可能。 @TemporalWolf 知道了!看到编辑,我希望这是你想要的。 【参考方案1】:

你不应该在这里需要熊猫。只需遍历文件的行并将固定的行写入新文件即可。

with open('new.csv', 'w') as newcsv:
    with open('file.csv') as csvf:
        for line in csvf:
            head, _, tail = line.strip().rpartition(',')
            newcsv.write('\t\n'.format(head, tail))

这应该可以完成工作。

【讨论】:

对,我正在使用 pandas,并没有想到更简单的解决方案。这应该可以,我会试试(只需要在第一次打开时添加“w”)。【参考方案2】:

你甚至不必使用 python:

sed -i 's/\(.*\),/\1\t/' $INPUT

/t 替换行中的最后一个,

如果你想保留输入:

sed 's/\(.*\),/\1\t/' $INPUT > $OUTPUT

我怀疑这会比通过 python 运行更快,但这只是一个猜测。

【讨论】:

我在windows上 @user 那么python就足够了。我会把这个留给未来的观众。 我认为这对 Unix 上的人来说是一个很好的答案,谢谢(给你 +1)

以上是关于使用 python 和 pandas 将错误创建的大型 csv 文件转换为制表符分隔文件的主要内容,如果未能解决你的问题,请参考以下文章

Python:打印 Pandas 数据框返回 numpy.ndarray 属性错误

如何使用 Python 和 Pandas 创建比 RAM 更大的 csv 文件

Python 中的 InfluxDB 和 pandas 错误

在 python 中使用 panda 库和 Dash Plotly 创建带有标签和值的下拉菜单

如何在 python 中使用 Pandas 数据框顺序创建和保存 csv 文件

在 pandas for python 中创建虚拟变量