将最后100个文件串联在一个仅在

2024-04-18 22:21:44 发布

您现在位置:Python中文网/ 问答频道 /正文

Python中的Begginer需要一些帮助。我使用的是python2.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]

我想问题在于循环及其结构“range(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

有什么办法可以实现我的目标吗?你知道吗

我希望我已经解释清楚了。也许我错过了一些重要的东西,对不起,我只是这个领域的初学者。你知道吗

谢谢你。你知道吗


Tags: 文件intestimport文件夹osfilesopen
3条回答

您需要更改:

filename=open(filename,"rb")

…比如:

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

inf.close()

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

注意:不要显式地打开和关闭文件,而是尝试使用with语句(参见this helpful guide)。你知道吗

Checn如果glob是匹配模式

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

你没有检查例外情况。你知道吗

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

这是因为filename是一个整数,然后您试图用一个字符串连接它。你知道吗


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

这是因为您正在将变量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))

相关问题 更多 >