2012-07-20 91 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