Лучший способ доступа к N-й строке файла csv

Мне нужно получить доступ к N-й строке в CSV-файле.

Вот что я сделал:

  • Лучший способ для чтения новых строк с разделителями в Python и отбрасывания новых строк?
  • Запись списка в файл с помощью Python
  • Что читает sys.stdin?
  • Python командной строки 'входной поток файла'
  • Python: модуль для создания файла блокировки на основе PID?
  • Чтение Огромного файла в Python
  • import csv the_file = open('path', 'r') reader = csv.reader(the_file) N = input('What line do you need? > ') i = 0 for row in reader: if i == N: print("This is the line.") print(row) break i += 1 the_file.close() 

    … но это не кажется оптимальным. Редактирование для точности: если файл огромен, я не хочу проходить через все строки, и я не хочу загружать весь файл в память.

    Надеюсь, что-то вроде reader[N] существует, но я его не нашел.

    Изменить ответ: эта строка (исходящая от выбранного ответа) – это то, что я искал:

     next(itertools.islice(csv.reader(f), N, None) 

  • Python из памяти большого CSV-файла (numpy)
  • Чтение огромного файла .csv
  • Как открыть файл с помощью оператора open with
  • Как Pretty Печать CSV-файла в Python
  • Python: SyntaxError
  • Чтение из CSV в Python неоднократно?
  • 6 Solutions collect form web for “Лучший способ доступа к N-й строке файла csv”

    Это мало чем отличается, но немного проще использовать enumerate а не создавать собственную переменную счетчика.

     for i, row in enumerate(reader): if i == N: print("This is the line.") print(row) break 

    Вы также можете использовать itertools.islice который предназначен для этого типа сценария – доступ к определенному фрагменту итерации без чтения всего этого в память. Это должно быть немного более эффективным, чем цикл через нежелательные строки.

     with open(path, 'r') as f: N = int(input('What line do you need? > ')) print("This is the line.") print(next(itertools.islice(csv.reader(f), N, None))) 

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

     my_csv_data = list(reader) print(my_csv_data[N]) 

    На самом деле ваше решение не так уж плохо. Переход итератора файла на нужную вам линию является хорошим подходом и используется во многих ситуациях, подобных этому.

    Если вы хотите, чтобы он был более кратким, вы можете использовать next и enumerate с выражением генератора :

     import csv the_file = open('path', 'r') reader = csv.reader(the_file) N = int(input('What line do you need? > ')) line = next((x for i, x in enumerate(reader) if i == N), None) print(line) the_file.close() 

    В None нет, что будет возвращено, если строка не найдена ( N слишком велико). Однако вы можете выбрать любую другую ценность.


    Вы также можете открыть файл с помощью оператора-оператора, чтобы он автоматически закрывался:

     import csv with open('path', 'r') as the_file: reader = csv.reader(the_file) N = int(input('What line do you need? > ')) line = next((x for i, x in enumerate(reader) if i == N), None) print(line) 

    Если вы действительно хотите сократить размер, вы можете сделать следующее:

     from csv import reader N = int(input('What line do you need? > ')) with open('path') as f: print(next((x for i, x in enumerate(reader(f)) if i == N), None)) 

    Вы можете просто сделать:

     n = 2 # line to print fd = open('foo.csv', 'r') lines = fd.readlines() print lines[n-1] # prints 2nd line fd.close() 

    Или даже лучше использовать меньше памяти, не загружая весь файл в память:

     import linecache n = 2 linecache.getline('foo.csv', n) 

    Модуль itertools имеет ряд функций для создания специализированных итераторов – и его islice() может быть использована для решения этой проблемы:

     import csv import itertools N = 5 # desired line number with open('path.csv', newline='') as the_file: row = next(csv.reader(itertools.islice(the_file, N, N+1))) print("This is the line.") print(row) 

    PS Для любопытных мой первоначальный ответ – который также работает (возможно, лучше) – был:

      row = next(itertools.islice(csv.reader(the_file), N, N+1)) 

    Вы можете свести for минимуму ваш цикл for в выражении понимания, например

     row = [row for i,row in enumerate(reader) if i == N][0] # or even nicer as seen in iCodez code with next and generator expression row = next(row for i,row in enumerate(reader) if i == N) 
     import csv with open('cvs_file.csv', 'r') as inFile: reader = csv.reader(inFile) my_content = list(reader) line_no = input('What line do you need(line number begins from 0)? > ') if line_no < len(my_content): print(my_content[line_no]) else: print('This line does not exists') 

    В result вы можете directly получить любую строку по index :

     What line do you need? > 2 ['101', '0.19', '1'] What line do you need? > 100 This line does not exists 
    Python - лучший язык программирования в мире.