Python 3.6 - проблема форматирования (+ другие проблемы) - PullRequest
0 голосов
/ 30 сентября 2018

Часть A - пустые строки

В настоящее время я работаю над визуализацией данных Kyran Dale с использованием Python и JavaScript.Из примера 3.1 у меня есть это:

nobel_winners = [
{'name'       : 'Albert Einstein',
 'nationality': 'German', 
 'sex'        : 'male',
 'category'   : 'Physics',
 'year'       : 1921},
{'name'       : 'Paul Dirac',
 'nationality': 'British', 
 'sex'        : 'male',
 'category'   : 'Physics', 
 'year'       : 1933},
{'name'       : 'Marie Curie',
 'nationality': 'Polish', 
 'sex'        : 'female',
 'category'   : 'Chemistry', 
 'year'       : 1911}
]

cols = nobel_winners[0].keys()
# cols.sort() # <<== this produces an error - see below

with open('./nobel_winners.csv', 'w') as f:
    f.write(','.join(cols) + '\n')

    for o in nobel_winners:
        row = [str(o[col]) for col in cols]
        f.write(','.join(row) + '\n')

with open('./nobel_winners.csv') as f:
    for line in f.readlines():
        print(line),

Теперь результирующий файл (noble_winners.csv) выглядит следующим образом:

name,nationality,sex,category,year
Albert Einstein,German,male,Physics,1921
Paul Dirac,British,male,Physics,1933
Marie Curie,Polish,female,Chemistry,1911

, что хорошо, НО , когда я делаю распечатку (последние 3 строки кода), я получаю это:

[pol@UNKNOWN example_3.1]$ python example3.1.py 
name,nationality,sex,category,year

Albert Einstein,German,male,Physics,1921

Paul Dirac,British,male,Physics,1933

Marie Curie,Polish,female,Chemistry,1911

[pol@UNKNOWN example_3.1]$

т.е. между каждой строкой есть пробелы (которых я не хочу!).Автор конкретно говорит о запятой в самом конце здесь (последняя строка кода) print (строка),"Добавление запятой после вызова функции print запрещает добавление ненужногоНовая строка. ".

Очевидно, это не так.Если я удалю запятую, то получу тот же результат, то есть пробелы в моей распечатке.

Я хотел бы знать:

  1. как получить «чистую» распечатку- то есть без пустых строк и

  2. некоторого понимания того, что автор пытался сделать - что должен делать этот «трюк» с запятыми?Как это должно работать?

Часть B - меньшая точка, но все же любопытно.

Если я раскомментирую строку cols.sort (), я получуthis:

[pol @ UNKNOWN example_3.1] $ python example3.1.py Traceback (последний вызов был последним): файл "example3.1.py", строка 20, в cols.sort () #<< == это приводит к ошибке - см. ниже AttributeError: у объекта 'dict_keys' нет атрибута 'sort' </p>

Теперь я даже не понимаю, что автор получает здесь

  1. почему он пытается использовать метод, который не существует?

  2. даже если это сработало, какой смысл - у него просто будут заголовки столбцовне синхронизировано с его данными?

Любое объяснение (я) с благодарностью получено.

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

Некоторые части вопроса не были объяснены ИМО:

Теперь я даже не понимаю, что автор делает здесь

  1. почемуон пытается использовать метод, который не существует?

  2. даже если он сработал, какой смысл - он просто собирается синхронизировать заголовки столбцов со своими данными?


Ответ 1:

cols = nobel_winners[0].keys()
# cols.sort() # <<== this produces an error - see below

В Python 3 .keys() не создает список ключей.Он возвращает «представление», то есть объект, который динамически изменяется с помощью dict.Это делает его доступным только для чтения (он поддерживает итерацию и проверку членства).Сортировка невозможна.

Чтобы обработать ключи словаря, сделайте «снимок» представления, то есть копию в виде списка, или кортежа, или набора в зависимости от ваших потребностей.Например:

keys = list(somedict.keys())

Полученные данные keys больше не связаны с исходным диктом.

Метод sorted, упомянутый в ответе @stackels, тоже подойдет.Он также делает копию.

То же самое относится и к значениям dict.


Ответ2:

Не совсем понятно, почему автор предпочитает отсортированный порядок,но ему определенно нужно установить некоторый порядок столбцов, потому что порядок данных в обычном dict не определен.Поэтому он устанавливает порядок столбцов и использует один и тот же порядок для заголовка и для всех строк данных.Таким образом, они не могут выйти из синхронизации.

0 голосов
/ 30 сентября 2018

Похоже, что автор использовал другую версию Python для сценариев.Я бы порекомендовал следующие два фрагмента кода в Python 3:

  1. print(line, end="") удаляет суффикс новой строки и
  2. sorted(cols) или даже sorted(nobel_winners[0]), поскольку он автоматически использует ключи ввода,В противном случае вам придется использовать sorted(nobel_winners[0].values()).
...