只连接一个最后100个文件

时间:2015-02-10 17:45:19

标签: python

Python中的Begginer需要一些帮助。我使用的是Python 2.7。

我想创建一个程序来连接文件夹中的最后100个文件。在该文件夹中,我有很多文件,但我只想要最后100个文件的串联。我能够连接所有这些(如果我没有指定数字并更改for循环),但我无法选择最后100个文件。这些文件由软件保存为二进制文件。它们保存在下面指定的文件夹中。我想删除那100个文件一次连接到新的文件。我做的程序如下:

#!/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()

它没有做任何事情,错误如下:

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()

除了删除顺序之外它没有用,这显示了这个错误:

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

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

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

谢谢。

3 个答案:

答案 0 :(得分:1)

  

TypeError:强制转换为Unicode:需要字符串或缓冲区,找到int

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


  

os.remove(文件名)   必须是字符串,而不是文件

这是因为您正在将变量filename(这是一个字符串路径)重新分配给文件句柄/对象。 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))

答案 1 :(得分:0)

您需要更改:

filename=open(filename,"rb")

...类似于:

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

inf.close()

然后,当您调用os.remove(filename)时,它仍然是原始循环中的文件名,而不是您的代码重新分配给此的file object变量

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

答案 2 :(得分:-1)

如果glob匹配模式

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

通过构建每个包含文件名和mtime

的元组列表来获取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()

您没有检查异常。