提问人:Skynet 提问时间:11/14/2023 最后编辑:Zach YoungSkynet 更新时间:11/14/2023 访问量:38
将文件夹路径从.csv导入联接到文件名
Join Folder Path to File Name from .csv Import
问:
我正在尝试编写一个程序,该程序将接收包含 1 列文件名的 CSV 文件,附加源,然后是目标文件路径,然后将这些选择文件移动到目标文件夹。 Csv 示例:
img1.jpg
img2.jpg
img3.jpg
etc...
我尝试了在这个网站上找到的几个不同版本的解决方案,但它们对我来说都有相同的错误:
"TypeError: can only concatenate str (not "list") to str
这是我最近的代码:
import csv
import shutil
# Test path variables
source_folder = "/Users/user/Desktop/testSource/"
destination_folder = "/Users/user/Desktop/testDest/"
list_path = "/Users/user/Desktop/"
list_file = "test.csv"
list_name = list_path + list_file
print("Importing from file: ",list_name)
# Opens the.csv and saves result to a list
with (open(list_name, 'r') as csvfile):
reader = csv.reader(csvfile, delimiter=',')
file_names = list(reader)
print("I found these entries: ",file_names)
source_files = [source_folder + i for i in file_names]
print(source_files)
这是发生错误的地方,尽管进行了多次迭代。我无法连接列表中的元素,也无法将列表拆分为离散元素。Python 似乎认为file_names既是列表又不是列表。如果我能让源追加部分工作,我可以复制目标,并构建要迭代的完整路径列表。
任何帮助将不胜感激,我不知道我错过了什么。
尝试将源/目标文件路径联接到列表中的每个元素,期望将完整路径名移交给 shutil。
我不断收到错误。can only concatenate str (not "list") to str
答:
0赞
Zach Young
11/14/2023
#1
即使 CSV 只有一列,csv.reader 也会将“行”视为字符串列表。
如果打印变量,则会看到多行(字符串列表):file_names
[
['img1.jpg'],
['img2.jpg'],
['img3.jpg'],
]
您的列表推导式仅在行级别进行迭代,仍然是字符串列表,因此您实际上是在尝试连接字符串和列表(字符串)。从图上讲,这看起来像:[... for i in file_names]
i
source_folder + ['img1.jpg']
所以 Python 给了我们一个明智的错误,
Importing from file: ./input.csv
I found these entries: [['img1.jpg'], ['img2.jpg'], ['img3.jpg']]
Traceback (most recent call last):
File "/Users/zyoung/develop/StackOverflow/main.py", line 17, in <module>
source_files = [source_folder + i for i in file_names]
~~~~~~~~~~~~~~^~~
TypeError: can only concatenate str (not "list") to str
(我们还可以在打印输出中看到,“我找到了这些条目”,我们正在处理字符串列表)
对于您的简单情况,只需索引到行中以获取第一个(也是唯一)字段即可解决问题:
[source_folder + i[0] for i in file_names]
评论
1赞
Skynet
11/14/2023
非常感谢!我的帐户太新了,无法给您带来声誉,但我非常感谢!!
评论