#python #csv #double-quotes
#python #csv-файл #двойные кавычки
Вопрос:
Я хочу создать csv-файл из существующего csv-файла, разделив его строки.
Введите CSV-файл:
A,R,T,11,12,13,14,15,21,22,23,24,25
Вывод csv:
A,R,T,11,12,13,14,15
A,R,T,21,22,23,24,25
Пока мой код выглядит так:
def update_csv(name):
#load csv file
file_ = open(name, 'rb')
#init first values
current_a = ""
current_r = ""
current_first_time = ""
file_content = csv.reader(file_)
#LOOP
for row in file_content:
current_a = row[0]
current_r = row[1]
current_first_time = row[2]
i = 2
#Write row to new csv
with open("updated_" name, 'wb') as f:
writer = csv.writer(f)
writer.writerow((current_a,
current_r,
current_first_time,
",".join((row[x] for x in range(i 1,i 5)))
))
#do only one row, for debug purposes
return
Но строка содержит двойные кавычки, от которых я не могу избавиться:
A002,R051,02-00-00,"05-21-11,00:00:00,REGULAR,003169391"
Я пробовал использовать writer = csv.writer(f,quoting=csv.QUOTE_NONE)
и получил _csv.Error: need to escape, but no escapechar set
.
Каков правильный подход к удалению этих кавычек?
Комментарии:
1. вы пытались преобразовать строку [x] в строку. т.е. str(строка [x])?
2. Вы не указали escapchar . как указано в ссылке docs.python.org/2/library/csv.html#csv . QUOTE_NONE , вам нужно установить escapechar для использования QUOTE_NONE
3. @user2109788: да, безуспешно: A002,R051,02-00-00,<объект генератора <genexpr> в 0x373ca50>
Ответ №1:
Я думаю, вы могли бы упростить логику разделения каждой строки на две, используя что-то вроде этих строк:
def update_csv(name):
with open(name, 'rb') as file_:
with open("updated_" name, 'wb') as f:
writer = csv.writer(f)
# read one row from input csv
for row in csv.reader(file_):
# write 2 rows to new csv
writer.writerow(row[:8])
writer.writerow(row[:3] row[8:])
Комментарии:
1. Пожалуйста. Пожалуйста, подумайте также о том, чтобы проголосовать за мой ответ, если вы считаете его достойным. Спасибо.
2. требуется 15 повторений. для этого… будет голосовать, когда я выполню квоту. извините
3. О, да, that…no проблема. Кстати, я немного обновил свой ответ, чтобы он был более полным.
Ответ №2:
writer.writerow
ожидает итерацию таким образом, чтобы он мог записывать каждый элемент в итерацию как один элемент, разделенный соответствующим разделителем, в файл. Итак:
writer.writerow([1, 2, 3])
будет выполняться запись "1,2,3n"
в файл.
Ваш вызов предоставляет итерацию, одним из элементов которой является строка, которая уже содержит разделитель. Поэтому ему нужен какой-то способ либо избежать разделителя, либо заключить этот элемент в кавычки. Например,
write.writerow([1, '2,3'])
Не просто выдает "1,2,3n"
, но, например '1,"2,3"n'
, — строка считается одним элементом в выходных данных.
Поэтому, если вы хотите, чтобы в выходных данных не было кавычек, вам необходимо указать escape-символ (например '/'
), чтобы отметить разделители, которые не должны учитываться как таковые (давая что-то вроде "1,2/,3n"
).
Однако я думаю, что на самом деле вы хотите включить все эти элементы в качестве отдельных элементов. Не ",".join(...)
делайте их самостоятельно, попробуйте:
writer.writerow((current_a, current_r,
current_first_time, *row[i 2:i 5]))
чтобы предоставить соответствующие элементы из row
как отдельные элементы в кортеже.
Комментарии:
1. Хорошее объяснение, я оставлю это в своих любимых.