Итерация по параллельным спискам и преобразование текста с разделителями табуляции в одном списке в путь CSV в другом

1

В настоящее время я ищу для создания сценария, который принимает файлы.txt (с разделителями табуляции) и преобразует их в.csv. Я получаю сообщение и ошибка, которая говорит (нужен байтовый объект, а не "str") при запуске следующего кода. Каков наилучший способ завершить эту операцию?

  import csv
  import itertools

  txt_file_P_T = r"mytxt_P_T.txt"
  txt_file_P_C = r"mytxt_P_C.txt"
  txt_file_S_T = r"mytxt_S_T.txt"
  txt_file_S_C = r"mytxt_S_C.txt"

  csv_file_P_T = r"mycsv_P_T.csv"
  csv_file_P_C = r"mycsv_P_C.csv"
  csv_file_S_T = r"mycsv_S_T.csv"
  csv_file_S_C = r"mycsv_S_C.csv"

  text_list = [txt_file_P_T, txt_file_P_C, txt_file_S_T, txt_file_S_C]
  csv_list = [csv_file_P_T, csv_file_P_C, csv_file_S_T, csv_file_S_C]

  for i, j   in zip(text_list, csv_list):
      in_txt = csv.reader(open(i, "rt"),)
      out_csv = csv.writer(open(j, 'wb'))
      out_csv.writerows(in_txt)
Показать ещё 1 комментарий
Теги:
csv
python-3.x
itertools
tab-delimited

1 ответ

2
Лучший ответ

Модуль csv сильно изменился между Python2 и Python3. В Python2 основной файл-объект для csv-записи должен быть открыт в двоичном режиме. В Python3 он должен быть открыт в текстовом режиме (который позволяет указать явное кодирование) и с параметром newline = '' чтобы избежать преобразования конца строки.

Таким образом, вы должны иметь:

...
for i, j   in zip(text_list, csv_list):
      in_txt = csv.reader(open(i))
      out_csv = csv.writer(open(j, 'w', newline = ''))
      out_csv.writerows(in_txt)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню