#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
. Пожалуйста, отметьте ответ, если это помогло вам, кстати.