我有一个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
答案 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