我刚刚遇到了一些似乎在 python 论坛或任何教程中都没有讨论过的问题。至少我找不到任何解释。
我想使用 Python/pandas 逐行读取 csv 文件并将这些行写入(附加)到另一个 csv 文件。
不要想知道我为什么这样做:我想逐行修改一个非常大的 csv 文件(行号>> 10000),并且如果需要的话还必须插入额外的新行...
这是我的最小示例,它可以说明我的意思:
import csv
import pandas as pd
# get total number of rows
file_content = pd.read_csv('test_read.csv')
row_count = len(file_content)
i = 0
while i <= row_count:
# read DataFrame with single line from input file
df = pd.read_csv('test_read.csv', skiprows=lambda x: x!=i, sep=';', quoting=csv.QUOTE_NONE)
# write DataFrame to output file
df.to_csv('test_out.csv', mode='a', sep=';', index=False, quoting=csv.QUOTE_NONE)
i = i + 1
输入文件“test_read.csv”的内容,如Notepad++所示:
“位置 1”;“96”;“0”;“0”;“ABCDEF”;“5.67”;“0.0”;“ABCDEF”;“0”;“0”
"位置 2";"34";"0";"0";"GHIJKL";"5.53";"0.0";"OPQRST";"0";"0"
运行Python代码后,输出文件“test_out.csv”包含:
"位置 1";"96";"0";"0".1;"ABCDEF";"5.67";"0.0";"ABCDEF".1;"0".2;"0".3
"位置 2";"34";"0";"0".1;"GHIJKL";"5.53";"0.0";"OPQRST";"0".2;"0".3
可以看出,除了第一个之外,每行中的四个重复出现的“0”值都附加了某种索引号.1、.2和.3。与第一行中的“ABCDEF”字符串相同。所有其他人不受影响。
当我在读取 DataFrame df 时删除
skiprows=lambda x: x!=i
时,这种重复字符串的“编号”根本不会发生。
读取一个 DataFrame 中的多行时,只有每个 DataFrame 的第一行受此“编号”影响:
"位置 1";"96";"0";"0".1;"ABCDEF";"5.67";"0.0";"ABCDEF".1;"0".2;"0".3
"位置 2";"34";"0";"0";"GHIJKL";"5.53";"0.0";"OPQRST";"0";"0"
"位置 3";"27";"0";"0";"GHIJKL";"4.12";"0.0";"GHIJKL";"0";"0"
"位置 4";"49";"0";"0".1;"GHIJKL";"3.89";"0.0";"OPQRST";"0".2;"0".3
"位置 5";"71";"0";"0";"KLMNOP";"4.40";"0.0";"KLMNOP";"0";"0"
"位置 6";"52";"0";"0";"STUVWX";"6.72";"0.0";"STUVWX";"0";"0"
在这个 6 行示例中,我更改为
skiprows=lambda x: x not in [i, i+1, i+2]
和 i = i + 3
以读取每个 DataFrame 3 行。仅第一行和第四行受到影响。
我认为这可能来自我对
skiprows
的使用。是否有另一种方法可以逐行读取 csv 文件(使用 pandas),这可能不显示这种“编号”行为?
输出文件应由另一个软件读取,该软件拒绝读取它,包括附加的“数字”。 非常感谢任何帮助摆脱它们的帮助......
header=None
参数:
import csv
import pandas as pd
# get total number of rows
file_content = pd.read_csv("test_read.csv")
row_count = len(file_content)
i = 0
while i <= row_count:
# read DataFrame with single line from input file
df = pd.read_csv(
"test_read.csv", skiprows=lambda x: x != i, sep=";", quoting=csv.QUOTE_NONE, header=None
)
# write DataFrame to output file
df.to_csv("test_out.csv", mode="a", sep=";", index=False, header=None, quoting=csv.QUOTE_NONE)
i = i + 1
然后输出文件包含:
"Pos 1";"96";"0";"0";"ABCDEF";"5.67";"0.0";"ABCDEF";"0";"0"
"Pos 2";"34";"0";"0";"GHIJKL";"5.53";"0.0";"OPQRST";"0";"0"