Я читаю большой CSV-файл кусками, поскольку у меня недостаточно памяти для хранения. Я хотел бы прочитать первые 10 строк (от 0 до 9 строк), пропустить следующие 10 строк (от 10 до 19), затем прочитать следующие 10 строк (от 20 до 29 строк), снова пропустить следующие 10 строк (от 30 до 39) ), а затем прочитать строки от 40 до 49 и так далее. Ниже приведен код, который я использую:

#initializing n1 and n2 variable  
n1=1
n2=2
#reading data in chunks
for chunk in pd.read_csv('../input/train.csv',chunksize=10, dtype=dtypes,skiprows=list(range(  ((n1*10)+1), ((n2*10) +1) ))):
    sample_chunk=chunk
   #displaying the  sample_chunk
   print(sample_chunk)
   #incrementing n1
    n1=n1+2
   #incrementing n2
    n2=n2+2

Тем не менее, код не работает, как я предполагаю, я разработал. Он пропускает только строки с 10 по 19 (то есть: он читает строки с 0 по 9, пропускает с 10 по 19, затем читает с 20 по 29, затем снова читает с 30 по 39, затем снова читает с 40 по 49 и продолжает читать все строки ). Пожалуйста, помогите мне определить, что я делаю неправильно.

1
Noor 19 Фев 2019 в 14:34

2 ответа

Лучший ответ

код:

ro = list(range(0, lengthOfFile + 10, 10))
d = [j + 1 for i in range(1, len(ro), 2) for j in range(ro[i], ro[i + 1])]
# print(ro)
print(d)

pd.read_csv('../input/train.csv',chunksize=10, dtype=dtypes,skiprows=d)

например:

lengthOfFile = 100
ro = list(range(0, lengthOfFile + 10, 10))
d = [j for i in range(1, len(ro), 2) for j in range(ro[i], ro[i + 1])]
print(d)

< Сильный > выход: [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]

1
Nihal 19 Фев 2019 в 12:51

С помощью вашего метода вам необходимо определить все skiprows во время инициализации pd.read_csv, которые вы можете сделать так,

rowskips = [i for x in range(1,int(lengthOfFile/10),2) for i in range(x*10, (x+1)*10)]

Где lengthOfFile - длина файла.

Тогда для pd.read_csv

pd.read_csv('../input/train.csv',chunksize=10, dtype=dtypes,skiprows=rowskips)

Из документации:

skiprows : list-like, int or callable, optional

    Line numbers to skip (0-indexed) or number of lines to skip (int) at the start of the file.

    If callable, the callable function will be evaluated against the row indices, returning True if the row should be skipped and False otherwise. An example of a valid callable argument would be lambda x: x in [0, 2].

Таким образом, вы можете передать list, int или callable,

int -> пропускает указанные строки в начале файла
list -> пропускается номер строки, указанный в list
callable -> он оценивает номер строки с callable и затем решает пропустить или нет.

Вы передали list, который указывает во время инициации строки, которые нужно пропустить. Вы не можете обновить его снова. Другой способ - передать вызываемый объект lamda x: x in rowskips, и он оценит, соответствует ли строка условию пропуска.

1
hadi k 19 Фев 2019 в 13:36