прочитайте функцию csv для работы как в python2, так и в python3 (объект, подобный юникоду и байтам).

#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. Мир!