将文件夹路径从.csv导入联接到文件名

Join Folder Path to File Name from .csv Import

提问人:Skynet 提问时间:11/14/2023 最后编辑:Zach YoungSkynet 更新时间:11/14/2023 访问量:38

问:

我正在尝试编写一个程序,该程序将接收包含 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

python-3.x 列表 csv

评论

0赞 blhsing 11/14/2023
如果输入文件始终只包含一列,则没有充分的理由将其视为 CSV。只需逐行读取文件并将每一行视为文件名(去除换行符后)。
0赞 Skynet 11/16/2023
我没有考虑过这一点。CSV 是我想到的第一个选项,因为它很容易从 excel 导出,这已经是我工作流程的一部分。听起来像是扩展功能的好学习机会!

答:

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
非常感谢!我的帐户太新了,无法给您带来声誉,但我非常感谢!!