获取 ValueError:在尝试将匹配的文件名从 csv 复制到另一个目录时,没有足够的值来解压(预期为 2,得到 1)

Posted

技术标签:

【中文标题】获取 ValueError:在尝试将匹配的文件名从 csv 复制到另一个目录时,没有足够的值来解压(预期为 2,得到 1)【英文标题】:Getting ValueError: not enough values to unpack (expected 2, got 1) while trying to copy matching filenames from csv to another directory 【发布时间】:2019-08-30 00:53:57 【问题描述】:

您好,我正在尝试将 csv 中提到的文件从一个目录复制到另一个目录,但出现此错误。到目前为止的代码:

import os
import shutil
import csv
import sys

csv_file = "C:\\Users\\Lenovo\\.spyder-py3\\bha.csv"
existing_path_prefix = 'C:\\Users\\Lenovo\\.spyder-py3\\5KFILES\\'
new_path_prefix =  'C:\\Users\\Lenovo\\.spyder-py3\\err\\'

with open(csv_file, 'r') as f:
    reader = csv.reader(f)
    for (i, row) in enumerate(reader):
        if i == 0:
            print(i)
            pass    # Skip header row
        else:
            filename, filepath = row
            new_filename = os.path.join(new_path_prefix, filename)
            old_filename = os.path.join(filepath, filename)
            shutil.copy(old_filename, new_filename)

打印出的行如下所示:

['05-18-18 Letter from BA - DMFLTR _20984_ IR.txt']
['05-18-18 Letter from CA NDA 20758s74 ACK Letter.txt']
['05-21-18 Letter from CBE 30-IR Gr.txt']
['05-24-18 Letter from FA 020872.txt']
['05-Mar-2018 - CBER Acknowledgement - 2198519.txt']
['05-Sept-2018 - CBER Approval - CCR 2229614 - Switch from AD.txt']
['05.10.2018 Cea Approval, var 15G.txt']

【问题讨论】:

问题是变量“row”不包含你认为它包含的内容。打印出来试试? (并告诉我们它是什么) 它包含每个文件名的单独列表 @BilzzM 你能和我们分享一下它的样子吗? 请检查更新后的代码 row 是一个列表,你用错了。它必须通过使用一些索引来访问。 【参考方案1】:

根据您的 CSV,您的行基本上是 ['somestring'] 并且要解压缩到一个元组,您需要一个包含至少两个元素的列表/元组。

基本上每一行应该是这样的:filename, filepath = ['some filename', 'some filepath']

你可以使用正则表达式:

import re

pattern = re.compile("([a-zA-Z 0-9 \-_.,]+) (\w+\.\w+)")
match = re.search(pattern, '05-18-18 Letter from BA - DMFLTR _20984_ IR.txt')

print(match.group(1))
print(match.group(2))

产生

05-18-18 Letter from BA - DMFLTR _20984_
IR.txt

所以基本上你需要做的就是将行传递给re.search(pattern, row),然后将文件名和文件路径作为:

filename = match.group(1)
filepath = match.group(2)

【讨论】:

@BlizzM 好吧,您的 CSV 格式一开始就不正确。因为您想将05-18-18 Letter from BA - DMFLTR _20984_ IR.txt 存储到两个变量中。你有更好的 CSV 吗? 另一种方法是使用正则表达式来捕获文件名和文件路径,但它实际上取决于所有行,如果所有行的文件名看起来像something.txt 问题出在 csv 上。非常感谢你们。 @BilzzM 查看我的答案,您可以如何使用re 来替代它。顺便说一句,如果对您有帮助,请标记答案。

以上是关于获取 ValueError:在尝试将匹配的文件名从 csv 复制到另一个目录时,没有足够的值来解压(预期为 2,得到 1)的主要内容,如果未能解决你的问题,请参考以下文章

ValueError:时间数据“0”与格式“%d/%m/%Y”不匹配

获取ValueError:list.remove(x):x尝试从列表中删除值时不在列表中

Pandas 和 JSON ValueError:数组的长度必须相同

ValueError:使用字典时无法将不匹配长度分配给掩码数组

ValueError:缓冲区 dtype 不匹配,预期为“Python 对象”但得到“双倍”

Python ValueError:形状不匹配:无法将对象广播到单个形状