Удаление двойных кавычек из итератора при использовании csv writer

#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. Хорошее объяснение, я оставлю это в своих любимых.