我对python很陌生,而且我被一段我想要实现的代码所困扰。我希望我能在这里找到一些帮助。
我有一个特定的文件列表,我想在一个目录中复制。我已经在互联网上阅读了很多建议,但我还没有读过足够具体的内容。
所以,在这种情况下:我在" FROM"中的不同文件夹中有多个图片文件。夹。我只想将我喜欢的内容复制到目标文件夹中#34; TO"
目前,这就是我所拥有的(来自Stackoverflow上的另一个主题):
src = "/Volumes/MacintoshHD/TEST_SHUTIL/FROM"
dst = "/Volumes/MacintoshHD/TEST_SHUTIL/TO"
file_names = ["120099.TIFF", "901664.TIFF", "902257.TIFF"]
for file_name in file_names:
full_file_name = os.path.join(src, file_name)
if (os.path.isfile(full_file_name)):
shutil.copy(full_file_name, dst)
我想知道是否有办法在子文件夹中查找文件,如isfile但不测试每个文件夹。
我查看了copytree,但它对我来说并不是很有用......
起初我想用文件及其网址创建一个字典,但它比预期更复杂(由于很多原因),所以最简单的方法是能够在子文件夹中找到这些文件。
许多坦克
巴特。
答案 0 :(得分:1)
这将生成一个包含源目录的文件名及其子目录的文件名的列表:
file_names = [os.path.join(dp, f) for dp, dn, fn
in os.walk(src_dir) for f in fn]
然后您可以继续使用您的代码:
for file_name in file_names:
full_file_name = os.path.join(src, file_name)
if (os.path.isfile(full_file_name)):
shutil.copy(full_file_name, dst)
虽然您必须搜索整个目录树,但只需搜索一次。
答案 1 :(得分:1)
谢谢大家的答案。自从我发布问题以来已经有一段时间了,从那时起我就没有时间测试你的答案了。所以请原谅我。
我仔细阅读了它们。我想我理解他们,即使他们没有像这样工作。
我终于设法得到我想要的东西,但它的注意事项尽可能聪明。
我通过创建文件夹列表获得了文件副本。
以下是代码:
import os, shutil, fnmatch
src = ["/Volumes/MacintoshHD/TEST_SHUTIL/FROM/1", "/Volumes/MacintoshHD/TEST_SHUTIL/FROM/2", "/Volumes/MacintoshHD/TEST_SHUTIL/FROM/3"]
dst = "/Volumes/MacintoshHD/TEST_SHUTIL/TO"
listePlanDev = ["00120099.TIFF", "06901664.TIFF", "06902257.TIFF"]
for file_name in listePlanDev :
for dir_names in src:
full_file_name = os.path.join(dir_names, file_name)
if (os.path.isfile(full_file_name)):
shutil.copy(full_file_name, dst)
所以这是我开始时的树:
\Volumes
\MacintoshHD
\TEST_SHUTIL
\FROM
\1
- 00100001.TIFF
- 00120099.TIFF
\2
- 06900001.TIFF
- 06901664.TIFF
\3
- 06902257.TIFF
\TO
最后我喜欢
\Volumes
\MacintoshHD
\TEST_SHUTIL
\FROM
\1
- 00100001.TIFF
- 00120099.TIFF
\2
- 06900001.TIFF
- 06901664.TIFF
\3
- 06902257.TIFF
\TO
- 120099.TIFF
- 901664.TIFF
- 902257.TIFF
现在我需要使用os.walk在FROM中创建目录列表。当我使用程序时,应该有数千个它们。
这有很多阶段,我确信有更好的方法可以用更少的代码来实现它......
无论如何,我想提供一个"反馈"你的答案,谢谢大家。
巴特。
答案 2 :(得分:0)
<强> copytiffs.py 强>
#~/usr/bin/env python
import os, shutil, fnmatch
def main():
src = "Volumes/MacintoshHD/TEST_SHUTIL/FROM"
dst = "Volumes/MacintoshHD/TEST_SHUTIL/TO"
file_names = ["120099.TIFF", "901664.TIFF", "902257.TIFF"]
for root, dirnames, filenames in os.walk(src):
for target in file_names:
for candidate_filename in fnmatch.filter(filenames, target):
shutil.copy(os.path.join(root, candidate_filename), dst)
if __name__ == '__main__':
main()
在运行脚本之前*
[root@joeyoung.io copyfiles]# tree ./
./
`-- Volumes
`-- MacintoshHD
`-- TEST_SHUTIL
|-- FROM
| |-- 120099.TIFF
| |-- ignoreme.txt
| |-- sub1
| | |-- 901664.TIFF
| | `-- ignoreme.txt
| `-- sub2
| |-- 902257.TIFF
| `-- ignoreme.txt
`-- TO
RUNNING SCRIPT
[root@joeyoung.io copyfiles]# python copytiffs.py
在运行脚本之后
[root@joeyoung.io copyfiles]# tree
.
|-- Volumes
| `-- MacintoshHD
| `-- TEST_SHUTIL
| |-- FROM
| | |-- 120099.TIFF
| | |-- ignoreme.txt
| | |-- sub1
| | | |-- 901664.TIFF
| | | `-- ignoreme.txt
| | `-- sub2
| | |-- 902257.TIFF
| | `-- ignoreme.txt
| `-- TO
| |-- 120099.TIFF
| |-- 901664.TIFF
| `-- 902257.TIFF
`-- copytiffs.py
答案 3 :(得分:0)
也许在Unix
中使用Python
的find命令来搜索基础文件夹中的所有.TIFF
个文件?
import os
file_paths = os.popen('find . -name \*.TIFF -print').read().split('\n')
此处.
表示当前目录,您可以将其更改为您希望用作基本目录的路径。
<强>输出强>
>> for each in file_path:
print each
/Cpp/seive.TFF
/Cpp/seive2.TFF
....