Как импортировать файл 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.

Ответ 1

Модуль 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 = reader.next()
>>> 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))

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

Ответ 2

Для 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, либо не передайте аргумент (default read mode).

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)

Ответ 3

Вы можете использовать библиотеку pandas и ссылаться на строки и столбцы следующим образом:

import pandas as pd

input = pd.read_csv("path_to_file");

#for accessing ith row:
input.iloc[i]

#for accessing column named X
input.X

#for accessing ith row and column named X
input.iloc[i].X