我有许多文件在不同的路径与各种文件扩展名。
我的input.txt
内容如下,
/path/to/dir1/readme.html
/path/to/dir1/file.c
/path/to/dir1/file1.c
/path/to/dir1/a.html
/path/to/dir2/abc.java
/path/to/dir1/sample.js
/path/to/dir2/a.bin
/path/to/dir1/as.json
.......................
...........................
..............................
我需要过滤并将指定的扩展文件从所有出现的input.txt
文件移动到output.txt
文件。
为此,我有下面的脚本。
import shutil
input_file = 'input.txt'
output_file = 'output.txt'
file_extensions = ['.html', '.c', '.cpp', '.h', '.py', '.txt', '.js', '.json', '.csv']
with open(input_file, 'r') as input_file, open(output_file, 'w') as output_file:
for line in input_file:
file_path = line.strip()
if any(file_path.endswith(ext) for ext in file_extensions):
output_file.write(file_path + '\n')
shutil.move(file_path, file_path + '.processed')
print('Matching file moved to output.txt.')
预期的output.txt
应该如下所示。
/path/to/dir1/readme.html
/path/to/dir1/file.c
/path/to/dir1/file1.c
/path/to/dir1/sample.js
/path/to/dir1/as.json
上面的脚本不起作用,它失败了,并出现以下错误
Traceback (most recent call last):
File "/usr/lib/python3.8/shutil.py", line 791, in move
os.rename(src, real_dst)
FileNotFoundError: [Errno 2] No such file or directory: '/path/to/dir1/readme.html' -> '/path/to/dir1/readme.html.processed'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "split_src_libs.py", line 24, in <module>
shutil.move(file_path, file_path + '.processed')
File "/usr/lib/python3.8/shutil.py", line 811, in move
copy_function(src, real_dst)
File "/usr/lib/python3.8/shutil.py", line 435, in copy2
copyfile(src, dst, follow_symlinks=follow_symlinks)
File "/usr/lib/python3.8/shutil.py", line 264, in copyfile
with open(src, 'rb') as fsrc, open(dst, 'wb') as fdst:
FileNotFoundError: [Errno 2] No such file or directory: '/path/to/dir1/readme.html'
是什么导致了这个问题?
任何帮助将不胜感激过滤和移动文件到output.txt
文件。
注意:移动的文件不应存在于input.txt
文件中。
2条答案
按热度按时间5kgi1eie1#
shutil.move
移动/重命名文件系统上的文件。这会失败,可能是因为文件不存在,或者python脚本没有移动它的权限。
如果只想将名称附加到
output.txt
,请删除shutil
行。现在,如果我运行脚本,output.txt包含:
也就是说,考虑使用以下方法,使用
os.path.splitext
获取文件扩展名,然后您可以只执行if ext in file_extensions
,因此您不需要any
和循环:4szc88ey2#
如前所述,错误来自您试图移动的
file
不存在。但由于您不需要实际移动文件,只需要过滤输入文件,因此不需要
shutil.move
。下面是一个可行的解决方案,更新为只使用未移动的行重写input.txt:output.txt:
input.txt: