Я очень новичок в 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
Я знаю только, как держать куски столбцов вместе, но не только конкретные столбцы один за другим.
Вы можете сделать это с помощью простого понимания списка:
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']]
Вы можете использовать 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
usecols
Вы можете попытаться разделить каждую строку и явно назначить переменные; то просто игнорируйте переменные, которые вы не будете использовать (я их назвал _
, поэтому очевидно, что они не будут использоваться).
Это вызовет ошибки (в строке кода, которая имеет 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
with
для чтения файлов.