我的Excel工作表有一个像这样设置的文件名列表。 List of file names in directories
ZINC.7482347382.pdbqt无论文件是什么。 group / group50 stuff是它所在的子目录。
我想在Python中创建一个搜索每个文件的循环,并将其复制到一个新文件夹,这样我就不必自己查找和复制这些文件了。 (我想复制大约500个文件,以便于分析。)
这是我目前的代码。
import numpy as np
import csv
with open("Gabe_run1results.txt", "r") as my_file:
reader = csv.reader(my_file) # delimiter='\t')
my_list = list(reader)
myarray = np.asarray(my_list)
此代码将所有信息放入带有图片中列出的名称的列表中,然后将其存储为数组,以便我可以使用shutil.copy2执行循环以查找和复制文件。
Source是父文件,str(myarray [i])是特定的子目录。
l = 10
import shutil
#shutil.copy2(source,destination)
for i in range (0,l):
myarray[i]
source = "/Users/Gabriel/Desktop/" + str(myarray[i])
destination = "/Users/Gabriel/Desktop/blah"
shutil.copy2(source,destination)
但是,由于文件名作为字符串存储在数组中,因此会返回以下错误
错误:源/Users/Gabriel/Desktop/["group/group50/ZINC7483743.pdbqt"]不存在。
所以基本上我需要找到一种方法重新开始或者只是让循环读取数组为group / group50 / ZINC7483743.pdbqt而不是[" ZINC7483743.pdbqt"]
我很欣赏任何帮助。
答案 0 :(得分:0)
你正在打开并阅读csv。结果是一个行列表 - 即列列表。
然后你把它复制成一个numpy数组 - 我不知道你为什么这样做,但它不会改变形状:唯一可以解决的是2D数组(或1D)值为列表的数组,这不是更好的。)
然后,您尝试使用str
将这些行中的每一行转换为文件名。但所有这一切都是为了获得numpy数组的1D切片的字符串表示。所以你的路径看起来像废话,括号和引号。该错误显示您尝试使用的路径名:
Error: The source /Users/Gabriel/Desktop/["group/group50/ZINC7483743.pdbqt"] does not exist.
当然,桌面上没有名为[“group/group50/ZINC7483743.pdbqt”]
的文件。这个问题与需要过滤掉group50的东西无关,并在以后添加它。您只需要使用路径而不是路径列表。
由于路径似乎始终是CSV中的第一列(您只给了我们一个示例,所以我希望一个示例具有代表性),您可以通过这样做来解决它:
my_list = [row[0] for row in csv...]
而不是:
my_list = list(csv...)
然而,有一个更简单的解决方案。具有一列的CSV实际上不是CSV,它只是一个简单的行列表。那你为什么甚至使用CSV模块呢?只需打开文件,然后执行my_list = list(f)
。 (每行都是文件名加上换行符,因此您需要rstrip()
来获取文件名 - 但这比将其解析为CSV文件要简单得多。 )
虽然我们在这里,你为什么需要numpy数组,甚至列表?为什么不直接迭代文件中的行?
像这样:
with open(‘file_with_one_relative_path_per_line) as f:
for relpath in f:
source = "/Users/Gabriel/Desktop/" + relpath.rstrip()
destination = "/Users/Gabriel/Desktop/blah"
shutil.copy2(source,destination)