2015-02-10 36 views
0

Python中的Begginer需要一些帮助。我正在使用Python 2.7。只连接一个连接最后100个文件

我想制作一个连接文件夹中最后100个文件的程序。在那个文件夹中我有很多文件,但我只想要连接最后的100个文件。我能够完成所有这些的连接(如果我不指定数字并更改for循环),但我无法选择最后的100个文件。这些文件由软件以二进制格式保存。它们保存在下面指定的文件夹中。我想删除100个文件一次在德新one.The节目,我已经做了级联如下:

#!/usr/bin/python 
import os 
import glob 
os.chdir("C:\AFM_test\jpk_files") 
rout="" 
filename=glob.glob("*-*-*.*.*-*.*.*.jpk-force") 
filename.sort(key=os.path.getmtime) 
for filename in range(0,99): 
    filename=open(filename,"rb") 
    tout=filename.read()+\r\n" 
    rout = rout+tout 
    os.remove(filename) 
    filename.close() 
fout = open("output.jpk-force","wb+") 
fout.write(rout) 
fout.close() 

它doesn't做任何事情,错误是:

Traceback (most recent call last): 
File "C:\AFM_test\jpk_files\AFM_test.py", line 12, in <module> 
filename = open(filename,"rb") 
TypeError: coercing to Unicode: need string or buffer, int found 
[Finished in 0.1s] 

我想这个问题是环路及其结构“的范围(0,99)”,当我已经串接该文件夹中的所有文件为:

#!/usr/bin/python 
import os 
import glob 
os.chdir("C:\AFM_test\jpk_files") 
rout="" 
filename=glob.glob("*-*-*.*.*-*.*.*.jpk-force") 
for filename in files: 
    filename=open(filename,"rb") 
    tout=filename.read()+\r\n" 
    rout = rout+tout 
    os.remove(filename) 
    filename.close() 
fout = open("output.jpk-force","wb+") 
fout.write(rout) 
fout.close() 

它的工作好了,除了删除订单,显示了t他的错误:

Traceback (most recent call last): 
File "C:\try\AFM_test_2.py", line 17, in <module> 
os.remove(filename) 
must be string, not file 

任何想法如何实现我的目标?

我希望我能正确解释自己。也许我错过了一些重要的东西,对不起,我只是这个领域的初学者。

谢谢。

+0

检查错误发生线上的所有变量。打印出来,你会看到这个问题。 – acushner 2015-02-10 17:50:54

+0

您正在为'filename'分配三种完全不同类型的不同值,覆盖以前的任何值。首先它是一个glob列表,然后它是一个整数,然后它是一个打开的文件句柄。为不同的事情使用不同的变量作为开始。 – tripleee 2015-02-10 17:58:19

回答

1

TypeError: coercing to Unicode: need string or buffer, int found

这是因为filename是一个整数,然后你试图连接它与一个字符串。


os.remove(filename) must be string, not file

那是因为你重新分配变量名(这是一个字符串路径)的文件句柄/对象。 os.remove(..)需要for循环的变量,而不是open(..)的结果。它通常一个好的做法,让有意义的名称变量 - filepathinfile


一个更好的办法是:

def processFile(filepath): 
    with open(filepath) as f: 
     content = f.read() 
     os.remove(filepath) 
    return content 

def main(): 
    paths = glob.glob("..*..*..") 
    last100paths = paths[-100:] 
    with open(outFilePath, "w") as f: 
     f.write("\r\n".join(processFile(path) for path in last100paths)) 
0

你需要改变:

filename=open(filename,"rb") 

。 ..类似于:

inf = open(filename, "rb") 
... 

inf.close() 

然后,当你打电话给os.remove(filename)时,它会仍然是原始循环的文件名,而不是file object,你的代码重新分配给这个变量。

注意:尽管尝试使用with语句(请参阅this helpful guide),但并不是要明确打开和关闭文件。

如果 glob
-1

Checn是匹配模式

pattern = r"*-*-*.*.*-*.*.*.jpk-force" 
filenames=glob.glob(pattern) 
if not filenames: 
    print 'no files matched ', pattern 
    sys.exit(1) 

获取的mtime通过建立的元组的列表排序的文件列表,每个都包含文件名和修改时间

filenames = [ (filename,os.stat(filename)[8]) for filename in filenames ] 

按降序排序

名单与的mtime
filenames.sort(key=lambda x:x[1],reverse=True) 

以上两行可以简化如;

filenames = [ filename for filename in sorted(filenames,key=os.path.getmtime,reverse=True) ] 

以上线路可重构,因为我们可以在地方
filenames.sort(key=os.path.getmtime,reverse=True)

#!/usr/bin/python 
import os 
import glob 
os.chdir("C:\AFM_test\jpk_files") 
rout="" 
pattern = r"*-*-*.*.*-*.*.*.jpk-force" 
filenames=glob.glob(pattern) 
if not filenames: 
    print 'no files matched ', pattern 
    sys.exit(1) 

filenames.sort(key=os.path.getmtime,reverse=True) 
for filename in filenames[:100] 
    filecontent=open(filename,"rb") 
    tout=filecontent.read()+"\r\n" 
    filecontent.close() 
    rout = rout+tout 
    os.remove(filename) 

fout = open("output.jpk-force","wb+") 
fout.write(rout) 
fout.close() 

你没有检查异常排序。

+0

非常感谢,我看得非常亲近。我采取了Nizam Mohamed的模型。但我已经看了其他答案,我感到非常感激。我学到了很多,非常感谢,非常认真。 – Yuremer 2015-02-10 18:34:07

+0

但是在for行中,它将是: – Yuremer 2015-02-10 18:40:56

+0

用于文件名的文件名[-100:]: – Yuremer 2015-02-10 18:41:23