Как импортировать csv-файл, используя python с неповрежденными заголовками, где первый столбец не числовой

Это развитие предыдущего вопроса, но по мере того, как я углубляюсь в Python, я просто больше путаюсь с тем, как Python обрабатывает CSV-файлы).

У меня есть CSV-файл, и он должен оставаться таким (например, я не могу преобразовать его в текстовый файл). Это эквивалент массива, матрицы или вектора из 5 строк по 11 столбцов.

Я пытался читать в CSV, используя различные методы, которые я нашел здесь и в других местах (например, python.org ), чтобы сохранить связь между столбцами и строками, где первая строка и первый столбец = не числовые значения. Остальные являются значениями с плавающей точкой и содержат смесь положительных и отрицательных значений с плавающей точкой.

Что я хотел бы сделать, это импортировать CSV и скомпилировать его в python, чтобы, если бы я ссылался на заголовок столбца, он возвращал связанные с ним значения хранится в строках. Например:

>>> workers, constant, age
>>> workers
    w0
    w1
    w2
    w3
    constant
    7.334
    5.235
    3.225
    0
    age
    -1.406
    -4.936
    -1.478
    0

И так далее ...

Я ищу методы для обработки такого рода структуры данных. Я очень плохо знаком с Python.

56
задан Unihedron 10 November 2014 в 11:29
поделиться

2 ответа

Модуль csv Python обрабатывает данные построчно, что является обычным способом просмотра таких данных. Кажется, вам нужен подход по столбцам. Вот один из способов сделать это.

Предполагая, что ваш файл называется myclone.csv и содержит

workers,constant,age
w0,7.334,-1.406
w1,5.235,-4.936
w2,3.2225,-1.478
w3,0,0

, этот код должен дать вам одну-две идеи:

>>> import csv
>>> f = open('myclone.csv', 'rb')
>>> reader = csv.reader(f)
>>> headers = next(reader, None)
>>> headers
['workers', 'constant', 'age']
>>> column = {}
>>> for h in headers:
...    column[h] = []
...
>>> column
{'workers': [], 'constant': [], 'age': []}
>>> for row in reader:
...   for h, v in zip(headers, row):
...     column[h].append(v)
...
>>> column
{'workers': ['w0', 'w1', 'w2', 'w3'], 'constant': ['7.334', '5.235', '3.2225', '0'], 'age': ['-1.406', '-4.936', '-1.478', '0']}
>>> column['workers']
['w0', 'w1', 'w2', 'w3']
>>> column['constant']
['7.334', '5.235', '3.2225', '0']
>>> column['age']
['-1.406', '-4.936', '-1.478', '0']
>>>

Чтобы преобразовать числовые значения в числа с плавающей запятой, добавьте это

converters = [str.strip] + [float] * (len(headers) - 1)

вперед , и сделайте это

for h, v, conv in zip(headers, row, converters):
  column[h].append(conv(v))

для каждой строки вместо двух аналогичных строк выше.

89
ответ дан 26 November 2019 в 16:58
поделиться

Для Python 2

import csv
with open( <path-to-file>, "rb" ) as theFile:
    reader = csv.DictReader( theFile )
    for line in reader:
        # line is { 'workers': 'w0', 'constant': 7.334, 'age': -1.406, ... }
        # e.g. print( line[ 'workers' ] ) yields 'w0'

Python имеет мощный встроенный обработчик CSV. Фактически, большинство вещей уже встроено в стандартную библиотеку.

Для Python 3

Удалите аргумент rb и используйте либо r , либо не передавать аргумент ( режим чтения по умолчанию ).

with open( <path-to-file>, 'r' ) as theFile:
    reader = csv.DictReader(theFile)
    for line in reader:
        # line is { 'workers': 'w0', 'constant': 7.334, 'age': -1.406, ... }
        # e.g. print( line[ 'workers' ] ) yields 'w0'
        print(line)
120
ответ дан 26 November 2019 в 16:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: