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
任何想法如何实现我的目标?
我希望我已经正确地解释了自己。也许我错过了一些重要的事情,对不起,我只是这个领域的初学者。
谢谢。
答案 0 :(得分:1)
TypeError:强制转换为Unicode:需要字符串或缓冲区,找到int
那是因为filename
是一个整数,然后你试图用字符串连接它。
os.remove(文件名) 必须是字符串,而不是文件
这是因为您正在将变量filename(这是一个字符串路径)重新分配给文件句柄/对象。 os.remove(..)
期望来自for循环的变量,而不是open(..)
的结果。为变量提供有意义的名称通常是一种很好的做法 - filepath
和infile
等。
更好的方法是:
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
匹配模式
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()
您没有检查异常。