Получение ValueError: недостаточно значений для распаковки (ожидалось 2, получено 1) при попытке скопировать совпадающие имена файлов из csv в другой каталог

#python #file #csv #file-handling #valueerror

#питон #file #csv — файл #обработка файлов #ошибка значения #csv

Вопрос:

Привет, я пытаюсь скопировать файлы, упомянутые в 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']
  

Комментарии:

1. Проблема в том, что переменная «row» не содержит того, что вы думаете, что она содержит. Попробовать распечатать это? (и расскажите нам, что это такое)

2. Он содержит отдельный список каждого имени файла

3. @BilzzM можете ли вы поделиться с нами, как это выглядит?

4. Пожалуйста, проверьте обновленный код

5. строка — это список, вы используете его неправильно. К нему нужно получить доступ с помощью некоторого индекса.

Ответ №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)
  

Комментарии:

1. @BlizzM ну, во-первых, ваш CSV неправильно отформатирован. Потому что вы хотите сохранить 05-18-18 Letter from BA - DMFLTR _20984_ IR.txt в двух переменных. У вас есть лучший CSV?

2. Что можно было бы сделать в качестве альтернативы, так это использовать регулярное выражение для записи имени файла и пути к файлу, но это действительно зависит от всех строк, если для всех них имя файла выглядит как something.txt

3. Проблема была с csv. Большое вам спасибо, ребята.

4. @BilzzM ознакомьтесь с моим ответом, как вы могли бы сделать это альтернативно с re . Пожалуйста, отметьте ответ, если это помогло вам, кстати.