#python #csv
#питон #csv-файл #python #csv
Вопрос:
Я уже написал, что мне нужно для определения и анализа значения, которое я ищу, мне нужна помощь в записи столбца в csv-файл (или новый csv-файл) с проанализированным значением. Вот некоторый псевдокод / несколько реалистичный код Python для того, что я пытаюсь сделать:
# Given a CSV file, this function creates a new CSV file with all values parsed
def handleCSVfile(csvfile):
with open(csvfile, 'rb') as file:
reader = csv.reader(file, delimiter=',', lineterminator='n')
for row in reader:
for field in row:
if isWhatIWant(field):
parsedValue = parse(field)
# write new column to row containing parsed value
Я уже написал функции isWhatIWant
и. parse
Если мне нужно написать совершенно новый csv-файл, то я не уверен, как открыть оба файла одновременно, а также читать и записывать из одного в другой.
Ответ №1:
Я бы сделал это так. Я предполагаю, isWhatIWant()
что это то, что должно заменить поле на месте.
import csv
def handleCSVfile(infilename, outfilename):
with open(infilename, 'rb') as infile:
with open(outfilename, 'wb') as outfile:
reader = csv.reader(infile, lineterminator='n')
writer = csv.writer(outfile, lineterminator='n')
for row in reader:
for field_index, field in enumerate(row):
if isWhatIWant(field):
row[field_index] = parse(field)
writer.writerow(row)
Такой шаблон встречается часто и приводит к очень длинным строкам. Иногда может быть полезно разделить логику открытия и файлов на другую функцию, например:
import csv
def load_save_csvfile(infilename, outfilename):
with open(infilename, 'rb') as infile:
with open(outfilename, 'wb') as outfile:
reader = csv.reader(infile, lineterminator='n')
writer = csv.writer(outfile, lineterminator='n')
read_write_csvfile(reader, writer)
def read_write_csvfile(reader, writer)
for row in reader:
for field_index, field in enumerate(row):
if isWhatIWant(field):
row[field_index] = parse(field)
writer.writerow(row)
Это модулирует код, упрощая вам изменение способа обработки файлов и форматов из логики независимо друг от друга.
Дополнительные подсказки:
- Не называйте переменные
file
, поскольку это встроенная функция. Затенение этих имен укусит вас, когда вы меньше всего этого ожидаете. delimiter=','
используется по умолчанию, поэтому вам не нужно указывать его явно.
Комментарии:
1. Это имеет смысл. Я запутался только в одной части. Моя функция
parse
получает только искомое значение и возвращает проанализированное значение. Он не выполняет никакой обработки файлов.isWhatIWant
просто возвращает true или false в зависимости от того, является ли поле тем, что я ищу. Я не уверен, как заставить это работать с этой моделью….2. Это работает лучше, если вы можете привести полный минимальный пример, включая определение этих функций (определение заглушки подойдет). Код, который я написал, предполагает, что
isWhatIWant()
возвращает что-то, что может быть интерпретировано какTrue
илиFalse
и, котороеparse()
примет одно значение поля и вернет другое. Какую часть этого мы можем помочь вам понять?3. Неважно, это отлично работает. Единственная проблема заключается в том, что для имени файла требовались
w b
разрешения,rwb
было недопустимым, это была единственная проблема. В противном случае это работает отлично. Спасибо,4. Моя ошибка там. «wb» тоже должно быть хорошо. Я собираюсь отредактировать ответ.