我想根据--network="host"
文件中的匹配文件名将文件从一个大文件夹复制到另一个文件夹。
我的.txt
文件包含文件名:
list.txt
和另一个大文件夹包含许多ex文件。 S001
S002
S003
。
我只想从这个大文件夹中复制与我的S001, S002, S003, S004, S005
文件中的文件名匹配的文件。
我已经尝试过Bash,Python-无法正常工作。
list.txt
也不起作用。
我在Python中的逻辑无法正常工作:
for /f %%f in list.txt do robocopy SourceFolder/ DestinationFolder/ %%f
在Bash,Python或R中有答案吗?
谢谢
答案 0 :(得分:0)
我认为您的Python代码的问题在于,使用os.walk()
时,您的filename
每次都会是一个列表,在您的filenames_to_copy中找不到该列表。
我建议您尝试使用os.listdir()
,因为它将以字符串形式返回文件名/文件夹名称的列表-可以更轻松地与filenames_to_copy进行比较。
其他说明-也许您想在源而不是目标上执行os.listdir()
(或os.walk()
)。当前,如果文件已存在于目标中,则仅将文件从源复制到目标。
答案 1 :(得分:0)
os.walk()
将返回一个由三个元素组成的元组:被检查的当前目录的名称,其中的文件夹列表以及其中的文件列表。您只对后者感兴趣。因此,您应该使用以下方法进行迭代:
for _, _, filenames in os.walk(destination):
JezMonkey指出,os.listdir()
更易于使用,因为它将列出所请求目录中的文件和文件夹。但是,您将失去os.walk()
启用的递归搜索。如果您所有文件都在同一文件夹中而不是隐藏在某些文件夹中,则最好使用os.listdir()
。
我在您的代码中看到的第二个问题是,当我认为您想复制source
时,您复制了os.path.join(source, filename)
。
您能否发布与Python脚本有关的确切错误,以便我们更好地为您提供帮助。
更新
您实际上不需要列出源文件夹中的所有文件。使用os.path.exists
,您可以检查文件是否存在并复制文件。
import os
import shutil
def main():
destination = "DestinationFolder/copy"
source = "SourceFolder/MyBigData"
with open("list.txt", "r") as lines: # adapt the name of the file to open to your exact location.
filenames_to_copy = set(line.rstrip() for line in lines)
for filename in filenames_to_copy:
source_path = os.path.join(source, filename)
if os.path.exists(source_path):
print("copying {} to {}".format(source_path, destination))
shutil.copy(source_path, destination)
答案 2 :(得分:0)
您可以尝试以下代码-
import glob
big_dir = "~\big_dir"
copy_to = "~\copy_to"
copy_ref = "~\copy_ref.txt"
big_dir_files = [os.path.basename(f) for f in glob.glob(os.path.join(big_dir, '*'))]
print 'big_dir', big_dir_files # Returns all filenames from big directory
with open(copy_ref, "r") as lines:
filenames_to_copy = set(line.rstrip() for line in lines)
print filenames_to_copy # prints filename which you have in .txt file
for file in filenames_to_copy:
if file in big_dir_files: # Matches filename from ref.txt with filename in big dir
file_to_copy = os.path.join(big_dir, file)
copy_(file_to_copy, copy_to)
def copy_(source_dir, dest_dir):
files = glob.iglob(os.path.join(source_dir, '*'))
for file in files:
dest = os.path.join(dest_dir, os.path.basename(os.path.dirname(file)))
if not os.path.exists(dir_name):
os.mkdir(dest)
shutil.copy2(file, dest)
参考:
https://docs.python.org/3/library/glob.html
答案 3 :(得分:0)
感谢@PySaad和@Guillaume所做的贡献,尽管我的脚本现在正在运行:我添加了:
if os.path.exists(copy_to):
shutil.rmtree(copy_to)
shutil.copytree(file_to_copy, copy_to)
该脚本及其工作方式很吸引人:)
非常感谢您的帮助!