2016-03-24 25 views
0

約3000万行のテキストファイル内の特定の行(10884121)を削除しようとしています。これは私が最初に試みた方法ですが、実行すると約20秒間実行され、その後「メモリエラー」が発生します。これを行うより良い方法はありますか?ありがとう!Python特定の行番号を削除する

import fileinput 
import sys 

f_in = 'C:\\Users\\Lucas\\Documents\\Python\\Pagelinks\\fullyCleaned2.txt' 
f_out = 'C:\\Users\\Lucas\\Documents\\Python\\Pagelinks\\fullyCleaned3.txt' 

with open(f_in, 'r') as fin: 
    with open(f_out, 'w') as fout: 
     linenums = [10884121] 
     s = [y for x, y in enumerate(fin) if x not in [line - 1 for line in linenums]] 
     fin.seek(0) 
     fin.write(''.join(s)) 
     fin.truncate(fin.tell()) 
+1

助けを ' –

答えて

1

まず、あなたはインポートを使用していませんでした。あなたは入力ファイルに書き込もうとしており、あなたのコードはファイル全体をメモリに読み込みました。

このようなことは、手間の少ないトリックを行う可能性があります。行単位で数値を集計するには、 を使用してください。enumerateそしてその数は無視行のない内のリストであれば、我々は、出力に書き込む行ごと:

f_in = 'C:\\Users\\Lucas\\Documents\\Python\\Pagelinks\\fullyCleaned2.txt' 
f_out = 'C:\\Users\\Lucas\\Documents\\Python\\Pagelinks\\fullyCleaned3.txt' 

ignored_lines = [10884121] 
with open(f_in, 'r') as fin, open(f_out, 'w') as fout: 
    for lineno, line in enumerate(fin, 1): 
     if lineno not in ignored_lines: 
      fout.write(line) 
+0

おかげで( ''。)■(参加)'列挙(フィン)をメモリにファイル全体を読んで、 'と' fin.writeしないでください!私はまだPythonには新しいので、実際にどのように動作するかはまだ分かっています。 – lsch91

0

使用してみてください:

import fileinput 

f_in = 'C:\\Users\\Lucas\\Documents\\Python\\Pagelinks\\fullyCleaned2.txt' 
f_out = 'C:\\Users\\Lucas\\Documents\\Python\\Pagelinks\\fullyCleaned3.txt' 

f = open(f_out,'w') 

counter=0 

for line in fileinput.input([f_in]): 
    counter=counter+1 
    if counter != 10884121: 
      f.write(line) # python will convert \n to os.linesep, maybe you need to add a os.linesep, check 

f.close() # you can omit in most cases as the destructor will call it 
0

あなたが不足し、高い可能性があります。あなたがリストにファイルを格納しようとしているので、 以下、これを試してみてください:

import fileinput 
import sys 

f_in = 'C:\\Users\\Lucas\\Documents\\Python\\Pagelinks\\fullyCleaned2.txt' 
f_out = 'C:\\Users\\Lucas\\Documents\\Python\\Pagelinks\\fullyCleaned3.txt' 
_fileOne = open(f_in,'r') 
_fileTwo = open(f_out,'w') 
linenums = set([10884121]) 
for lineNumber, line in enumerate(_fileOne): 
    if lineNumber not in linenums: 
     _fileTwo.writeLine(line) 
_fileOne.close() 
_fileTwo.close() 

をここでは、行毎にファイルを読み取り、必要のない行を除いている、これはメモリが不足しない場合があります。 また、バッファリングを使用してファイルを読み取ることもできます。 これが役立つことを願っています。

0

一般的なファイルフィルタ機能はどうですか?

def file_filter(file_path, condition=None): 
    """Yield lines from a file if condition(n, line) is true. 
     The condition parameter is a callback that receives two 
     parameters: the line number (first line is 1) and the 
     line content.""" 

    if condition is None: 
     condition = lambda n, line: True 

    with open(file_path) as source: 
     for n, line in enumerate(source): 
      if condition(n + 1, line): 
       yield line 

open(f_out, 'w') as destination: 
    condition = lambda n, line: n != 10884121 

    for line in file_filter(f_in, condition): 
     destination.write(line) 
関連する問題