#python #python-3.x #python-2.7
#питон #python-3.x #python-2.7
Вопрос:
Нам нужно поддерживать устаревшее приложение, пока оно переносится на python3 и rhel8.
таким образом, нам пришлось создать его обратно совместимую версию.
существует функция, которая считывает csv-файл.
в python3 у нас есть это:
from io import StringIO import csv def read_csv(filename): """ Sanitise and read CSV report """ # lowest number of columns to expect in the header sane_columns = 7 # temporary sanitised CSV stream = StringIO() with open(filename, encoding="utf-8") as csvfile: reader = csv.reader(csvfile) temp_writer = csv.writer(stream) for csv_row in reader: if len(csv_row) gt;= sane_columns: temp_writer.writerow(csv_row) # Move stream back to the start stream.seek(0) dict_reader = csv.DictReader(stream) return dict_reader
на python2 это приводит к следующей ошибке:
TypeError: unicode argument expected, got 'str'
затем мы меняем код для работы в python2:
from io import BytesIO import csv def read_csv(filename): """ Sanitise and read CSV report """ # lowest number of columns to expect in the header sane_columns = 7 # temporary sanitised CSV stream = BytesIO() with open(filename) as csvfile: reader = csv.reader(csvfile) temp_writer = csv.writer(stream) for csv_row in reader: if len(csv_row) gt;= sane_columns: temp_writer.writerow(csv_row) # Move stream back to the start stream.seek(0) dict_reader = csv.DictReader(stream) return dict_reader
но на python3 он выдает эту ошибку:
TypeError: a bytes-like object is required, not 'str'
как мы можем реорганизовать функцию, которую она будет запускать на обеих версиях python (2.7 и 3.6 )
в csv, который необходимо проанализировать, есть несколько строк мусора, вот пример:
some garbage lines Client Name,Policy Name,Status Code,Job Start Time,Job End Time,Job Status,Schedule Name,Schedule Type xxxxx,WN4_VMWARE_3M,0,"Nov 28, 2021 9:07:38 PM","Nov 28, 2021 9:38:38 PM",Successful,DI3M,Differential Incremental yyyyyy,WN4_VMWARE_3M,0,"Nov 28, 2021 9:04:52 PM","Nov 28, 2021 9:30:38 PM",Successful,DI3M,Differential Incremental
в качестве дополнительного вызова. Я не могу пользоваться библиотекой шести. не разрешается устанавливать пакет pip на серверах 🙁
Ответ №1:
Я бы использовал этот подход, чтобы определить, какая версия установлена, и если это одна версия, сделайте что-нибудь, а если нет, сделайте что-нибудь другое:
import sys print(sys.version_info[0]) if sys.version_info[0] lt; 3: #block of code else: #block of code
Ответ №2:
Я не уверен в правильном решении. Однако однажды мы столкнулись с аналогичной проблемой, в которой упомянутый нами формат кодировки был «utf-8», но один из коллег сохранил файл с помощью Excel, который преобразовал файл в какой-то другой формат, и после этого начала появляться вторая ошибка. Попробуйте сохранить файл в соответствующем формате csv. Мир!