python中文件的有条件复制

2024-04-26 23:43:37 发布

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

所以我试图将文件复制到另一个目录中,如果文件名以与我列表中的值相同的4位ID开头。 我要么把错误的数据写入文件,要么什么都没有。在

到目前为止我所拥有的:

import shutil
import os

ok_ids = [5252,
8396,
8397,
8397,
8556,
8004,
6545,
6541,
4392,
4392,
6548,
1363,
1363,
1363,
8489,
8652,
1368,
1368]

source = os.listdir("/Users/amm/Desktop/mypath1/")
destination = "/Users/amm/Desktop/mypath2/"

for files in source:
    for x in ok_ids:
        if files[:4] == x:
            shutil.copy(files,destination)
     else:
        print("not working")

我试图复制的文件示例,即source

^{pr2}$

destination目录为空

有几点很重要:ok_ids不包含不同的值,但我希望程序将该列表视为包含不同的值。例如,8397出现在ok_ids列表中两次,并且不需要在ok_ids循环中迭代两次(这是一个非常长的列表,我不喜欢编辑)。source通常也可以包含重复的id,使用上面的例子,这些id是00008652,但是文件名的其余部分是不同的。在

总而言之。。。如果0000在我的ok_ids列表中,并且在我的source目录中有以0000开头的文件名,那么我想将它们复制到我的destination文件夹中。在

我已经研究过使用.startswith,但是使用列表作为参数并不令人满意,即使我将其转换为元组,然后再转换为str。任何帮助都将是惊人的。在

这不起作用的原因可能是某些id包含连字符吗?还有一些是以charx开头的,而不是int值?在

前4个值是ID,例如这些值仍然有效:

309-_060202_112353.txt
x104_051203_064013.txt

Tags: 文件import目录ididssource列表os
2条回答
import os
import shutil
for root, dirs, files in os.walk("/Users/amm/Desktop/mypath1/"):
    for file in files:
        try:
            if int(file[:4]) in ok_ids:
               shutil.copy(file,destination)
        except:
            pass

这对我有用。唯一的问题是它对同一目录中的所有文件夹进行爬网。在

您的代码只需稍微修改一下str(x),而不是{},就可以了。在

请尝试使用此选项查看它对每个文件的操作:

for files in source:
    for x in ok_ids:
        if files[:4] == str(x):
            print("File '{}' matched".format(files))
            break
    else:
        print("File '{}' not matched".format(files))

或者,也可以将ok_ids中的所有项转换为字符串,然后查看这会产生什么结果:

^{pr2}$

这应该是有效的:

for file in source:
    for x in set(ok_ids):
        if file.startswith(str(x)):
            shutil.copy(file, destination)

使用set()使数字唯一,str()转换为字符串。因此可以将列表预处理为一个集合,以获得更好的性能。在

或者更好的是,考虑到您的命名限制:

^{pr2}$

为什么你的代码不起作用?在

if files[:4] == x:

你在比较一个str和一个int,直觉上,这总是错误的。在

相关问题 更多 >