В настоящее время я ищу для создания сценария, который принимает файлы.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)
Модуль 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)
wb
наw
вcsv.writer(open(j, 'wb'))