2012-07-20 92 views
4

我正在寫一個python程序來逐行拷貝一個文件到一個新文件中。我使用的代碼如下,我使用循環逐行復制文件。在python中逐行拷貝文件

但是,由於文件中的行數可能會發生變化,有沒有辦法在python中逐行復制文件,而不使用依賴於數字的循環,而是依賴於類似EOF字符的內容來終止循環?

import os 
import sys 

i = 0 
f = open("C:\\Users\\jgr208\\Desktop\\research_12\\sap\\beam_springs.$2k","r") 
copy = open("C:\\Users\\jgr208\\Desktop\\research_12\\sap\\copy.$2k","wt") 
#loop that copies file line by line and terminates loop when i reaches 10 
while i < 10: 
    line = f.readline() 
    copy.write(str(line)) 
    i = i +1 
f.close() 
copy.close() 
+2

'copy'是一個令人困惑的名稱,因爲Python有一個'copy'模塊。 – 2012-07-20 17:46:13

+0

*「我正在編寫一個python程序,將文件逐行復制到一個新文件中。」*爲什麼? – Marcin 2012-07-20 17:54:49

+1

爲什麼在寫入之前將行傳遞給str()?它應該以字符串的形式出現,所以str()是多餘的。 – CosmicComputer 2012-07-20 17:55:11

回答

11

您可以通過遍歷文件對象本身遍歷在Python中的文件對象行:

for line in f: 
    copy.write(line) 

docs on file objects

的另一種方法讀取線是循環播放文件對象。這是內存高效,快速,並導致簡單的代碼:

>>> for line in f: 
     print line, 
7

文件可以直接迭代,而無需顯式調用readline

f = open("...", "r") 
copy = open("...", "w") 
for line in f: 
    copy.write(line) 
f.close() 
copy.close() 
+1

'copy.write(line)'我想你的意思是 – 2012-07-20 17:50:35

+0

@JoranBeasley我做了,謝謝你的收穫。 – chepner 2012-07-20 19:07:57

3

shutil模塊更好這樣做的方法比逐行復制:

shutil.copyfile(src, dst)

將名爲src的 文件的內容(無元數據)複製到名爲dst的文件中。 dst必須是完整的目標文件名 ;請查看shutil.copy()獲取接受目標 目錄路徑的副本。如果src和dst是相同的文件,則引發Error。 目標位置必須是可寫的;否則,將引發一個IOError 異常。如果dst已經存在,它將被替換。 使用此功能複製特殊文件,如字符或塊設備和管道不能爲 。 src和dst是以 字符串形式給出的路徑名。

編輯:你的問題說你是逐行復制,因爲源文件是易失性的。有什麼東西對你的設計感到不適。你能分享關於你正在解決的問題的更多細節嗎?

+0

我正在解決的問題是使用python在matlab和sap2000之間建立一個接口,因爲python可以使用matlab和sap2000 COMS。界面將運行sap2000分析,並在完成後獲取數據並在matlab中進行一些矩陣計算。最後,它會根據矩陣計算重寫一行中更改的變量,並重復該過程x的次數。 – jgr208 2012-07-20 18:17:51

0

處理大量數據時,逐行寫入可能會很慢。您可以通過一次讀取/寫入一堆行來加速讀取/寫入操作。請參考我對類似問題的回答here