从BIG CSV文件Python中删除一行

时间:2018-09-08 22:12:37

标签: python python-3.x file

我有一个11GB的CSV文件,其中有一些必须删除的损坏行,我已经从ETL界面中识别出损坏的行号。

我的程序使用小的数据集运行,但是,当我想在主文件上运行时,我得到了MemoryError。在我正在使用的代码下面,您是否有任何建议使其正常工作?

row_to_delete = 101068
filename = "EKBE_0_20180907_065907 - Copy.csv"
with open(filename, 'r', encoding='utf8' ,errors='ignore') as file:
    data = file.readlines()
    print(data[row_to_delete -1 ])
    data [row_to_delete -1] = ''
with open(filename, 'wb',encoding="utf8",errors='ignore') as file:
    file.writelines( data )

错误:

Traceback (most recent call last):
  File "/.PyCharmCE2018.2/config/scratches/scratch_7.py", line 7, in <module>
    data = file.readlines()
MemoryError

1 个答案:

答案 0 :(得分:1)

而不是将整个列表读入内存,而是在输入文件上循环,然后将所有需要删除的行 写到新文件中。如果您需要按索引删除,请使用String Fullname , Firstname , Lastname; Scanner input = new Scanner(System.in); System.out.println("Enter Full Name"); Fullname = input.nextLine(); StringTokenizer st = new StringTokenizer(Fullname, " "); Firstname = st.nextToken(); Lastname = st.nextToken(); System.out.println("First Name: "+Firstname); System.out.println("Last Name: "+Lastname); 保留计数器:

enumerate()

您甚至可以直接在代码中检测到不良行,而不是使用索引。

请注意,这将写入一个具有相同名称但添加了row_to_delete = 101068 filename = "EKBE_0_20180907_065907 - Copy.csv" with open(filename, 'r', encoding='utf8', errors='ignore') as inputfile,\ open(filename + '.fixed', 'wb', encoding="utf8") as outputfile: for index, line in enumerate(inputfile): if index == row_to_delete: continue # don't write the line that matches outputfile.writeline(line) 的新文件。

复制完不良行以外的所有内容后,可以使用os.rename()将文件移回以替换旧文件:

.fixed