2013-03-20 102 views
1

假設我有一個文件(比如file1.txt),數據大約3mb或更多。如果我想將這些數據寫入第二個文件(如file2.txt),以下哪種方法會更好?更好的方法來讀取/寫入Python中的文件?

使用語言:Python的2.7.3

方法1

file1_handler = file("file1.txt", 'r') 
for lines in file1_handler: 
    line = lines.strip() 
    # Perform some operation 
    file2_handler = file("file2.txt", 'a') 
    file2_handler.write(line) 
    file2_handler.write('\r\n') 
    file2_handler.close() 
file1_handler.close() 

方法2

file1_handler = file("file1.txt", 'r') 
file2_handler = file("file2.txt", 'a') 
for lines in file1_handler: 
    line = lines.strip() 
    # Perform some operation 
    file2_handler.write(line) 
    file2_handler.write('\r\n') 
file2_handler.close() 
file1_handler.close() 

我認爲方法有兩個會更好,因爲你只需要一次打開和關閉file2.txt。你說什麼?

+2

用[open](http://docs.python.org/2/library/functions.html#open)打開文件,而不是[file](http://docs.python.org/2/庫/ functions.html#文件)。 – Matthias 2013-03-20 13:23:04

回答

6

使用with,它會自動關閉該文件,爲您提供:

with open("file1.txt", 'r') as in_file, open("file2.txt", 'a') as out_file: 
    for lines in in_file: 
     line = lines.strip() 
     # Perform some operation 
     out_file.write(line) 
     out_file.write('\r\n') 

使用open,而不是filefile已被棄用。

當然,在file1的每一行上打開file2是不合理的。

+1

我在寫同樣的想法:) @Hemant,看看:http://docs.python.org/2/whatsnew/2.5.html#pep-343-the-with-statement – 2013-03-20 13:17:24

+0

關於f2.write('\ r \ n'):爲了做到這一點,你需要打開f2作爲二進制文件(將「b」添加到標誌)。 – 2013-03-20 13:19:11

+0

哎呀!我認爲開放已被棄用:p(我沒有正確地閱讀文檔) 寫作的速度增加了嗎?因爲方法一複製1 MB數據需要將近2個小時。 – Hemant 2013-03-20 13:19:36

0

我最近在做類似的事情(如果我理解你的話)。如何:

file = open('file1.txt', 'r') 
file2 = open('file2.txt', 'wt') 

for line in file: 
    newLine = line.strip() 

    # You can do your operation here on newLine 

    file2.write(newLine) 
    file2.write('\r\n') 

file.close() 
file2.close() 

這種方法就像一個魅力!

+0

:很酷..感謝您的方法:) – Hemant 2013-03-20 13:28:33

0

我的解決方案(從帕維爾Anossov +緩衝派生):

dim = 1000 
buffer = [] 
with open("file1.txt", 'r') as in_file, open("file2.txt", 'a') as out_file: 
    for i, lines in enumerate(in_file): 
     line = lines.strip() 
     # Perform some operation 
     buffer.append(line) 
     if i%dim == dim-1: 
      for bline in buffer: 
       out_file.write(bline) 
       out_file.write('\r\n') 
      buffer = [] 

帕維爾Anossov第一次給了正確的解決方案:這只是一個建議;) 也許它的存在是爲了實現這個功能更優雅的方式。如果有人知道,請告訴我們。

+0

@ Francesco:嘿謝謝你的答案:)但我不太熟悉枚舉方法。請說明我使用枚舉的好處嗎? – Hemant 2013-03-21 05:44:05

+0

@Hemant:枚舉是有用的:)看看這裏:http://docs.python.org/2/library/functions.html#enumerate – 2013-03-21 07:37:31

+0

@ Francesco:謝謝你的文檔。現在我更清楚地理解你的例子。 :) – Hemant 2013-03-21 10:32:16