Python: как исключить определенные части строки при чтении из файла CSV

1

Я очень новичок в Python и пытаюсь прочитать файл CSV:

1980,Mark,Male,Student,L,90,56,78,44,88
1982,Cindy,Female,Student,S,45,76,22,42,90
1984,Kevin,Male,Student,L,67,83,52,55,59
1986,Michael,Male,Student,M,94,63,73,60,43
1988,Anna,Female,Student,S,66,50,59,57,33
1990,Jessica,Female,Student,S,72,34,29,69,27
1992,John,Male,Student,L,80,67,90,89,68
1994,Tom,Male,Student,M,23,60,89,78,39
1996,Nick,Male,Student,S,56,98,84,44,50
1998,Oscar,Male,Student,M,64,61,74,59,63
2000,Andy,Male,Student,M,11,50,93,69,90

Я хотел бы сохранить только конкретные атрибуты этих данных в словаре или список списков. Например, мне хотелось бы сохранить год, имя и пять чисел (в строке). Я не уверен, как исключить только три столбца.

Это код, который у меня есть сейчас:

def read_data(filename):
    f = open("myfile.csv", "rt")
    import csv
    data = {}
    for line in f:
        row = line.rstrip().split(',')
        data[row[0]] = [e for e in row[5:]]

    return data

Я знаю только, как держать куски столбцов вместе, но не только конкретные столбцы один за другим.

  • 0
    Осторожно: ваш код не закрывает файл после прочтения. Обычно это хорошая идея , чтобы использовать with для чтения файлов.
  • 0
    спасибо, я добавлю это!
Теги:
pandas
csv
readfile

3 ответа

0
Лучший ответ

Вы можете сделать это с помощью простого понимания списка:

def read_data(filename):
    f = open("myfile.csv", "rt")
    data = {}
    col_nums = [0, 1, 5, 6, 7, 8, 9]
    for line in f:
        row = line.rstrip().split(',')
        data[row[0]] = [row[i] for i in col_nums]

    return data

Вы также можете рассмотреть возможность использования Pandas, чтобы помочь вам читать и пресекать данные:

import pandas as pd
df = pd.read_csv("myfile.csv", columns=['year', 'name', 'gender', 'kind', 'size', 'num1', 'num2', 'num3', 'num4', 'num5'])
data = df[['year', 'name', 'num1', 'num2', 'num3', 'num4', 'num5']]
  • 0
    Осторожно: ваш первый пример кода не закрывает файл после прочтения (как и код в вопросе). Я также добавил тот же комментарий к вопросу.
  • 0
    Большое спасибо, это сработало отлично.
Показать ещё 1 комментарий
3

Вы можете использовать pd.read_csv() и передать нужные имена столбцов:

import pandas as pd

df = pd.read_csv('csv1.csv', names=['Year','Name','Gender','ID1','ID2','Val1','Val2','Val3','Val4','Val5'])

desired = df[['Year','Name','Val1','Val2','Val3','Val4','Val5']]

Урожайность:

    Year     Name  Val1  Val2  Val3  Val4  Val5
0   1980     Mark    90    56    78    44    88
1   1982    Cindy    45    76    22    42    90
2   1984    Kevin    67    83    52    55    59
3   1986  Michael    94    63    73    60    43
4   1988     Anna    66    50    59    57    33
5   1990  Jessica    72    34    29    69    27
6   1992     John    80    67    90    89    68
7   1994      Tom    23    60    89    78    39
8   1996     Nick    56    98    84    44    50
9   1998    Oscar    64    61    74    59    63
10  2000     Andy    11    50    93    69    90

Другим вариантом было бы передать столбцы с индексом вверх с помощью usecols, например:

df = pd.read_csv('csv1.csv', header=None, usecols=[0,1,5,6,7,8,9])

Обратите внимание, что это возвращает фреймворк с именами столбцов index-location:

       0        1   5   6   7   8   9
0   1980     Mark  90  56  78  44  88
1   1982    Cindy  45  76  22  42  90
2   1984    Kevin  67  83  52  55  59
3   1986  Michael  94  63  73  60  43
4   1988     Anna  66  50  59  57  33
5   1990  Jessica  72  34  29  69  27
6   1992     John  80  67  90  89  68
7   1994      Tom  23  60  89  78  39
8   1996     Nick  56  98  84  44  50
9   1998    Oscar  64  61  74  59  63
10  2000     Andy  11  50  93  69  90
  • 1
    Для лучшего решения вы можете пропустить необходимые столбцы при чтении CSV-файла, используя usecols
  • 1
    Я добавил это в качестве другого варианта в моем ответе.
0

Вы можете попытаться разделить каждую строку и явно назначить переменные; то просто игнорируйте переменные, которые вы не будете использовать (я их назвал _, поэтому очевидно, что они не будут использоваться).

Это вызовет ошибки (в строке кода, которая имеет split()), если строка имеет меньше или больше требуемых полей.

def read_data(filename):
    data = {}

    with open(filename) as f:
        for line in f:
            line = line.strip()
            if len(line) > 0:
                year, name, _, _, _, n1, n2, n3, n4, n5 = line.split(',')
                data[year] = [n1, n2, n3, n4, n5]

    return data

Ещё вопросы

Сообщество Overcoder
Наверх
Меню