Мне нужно проанализировать файл csv, и первая полезная информация в файле находится в 3-й строке и втором столбце.
Вот отрывок из того, что я сделал до сих пор:
f = open(filename, r)
reader = csv.reader(f, delimeter=';')
i=0
for row in reader:
if (i == 2):
useful_data = row[2]
break
else:
i += 1
но мне такой подход не нравится. Может ли кто-нибудь предложить лучший подход?
@Gautam нет, если csv многострочный, имеет кавычки, пробелы в значениях ...
обратите внимание, что во фрагменте есть опечатки: r => "r" и delimeter => delimiter
да, я должен использовать python, программное обеспечение написано на python.
В чем недостаток вашего раствора? Что вы пытаетесь улучшить?






Вместо цикла for, а затем break, используйте ручную итерацию файла с помощью next.
Просто пропустите столько строк, сколько хотите, используя next в программе чтения csv, затем используйте next в последний раз и выберите нужный столбец:
with open(filename) as f:
reader = csv.reader(f, delimiter=';')
# skip 2 rows
for _ in range(2):
next(reader)
useful_data = next(reader)[2]
Мне нравится ваше решение, но можем ли мы как-то избавиться от цикла for?
за 2 ряда пропустить, да, можно дважды вызвать next(reader) :)
хаха .. хороший там;)
есть хорошее решение с использованием islice, проверьте это. он использует цикл, но, по крайней мере, это не цикл Python
Что именно вам в нем не нравится? Я думаю, что немного лучше была бы версия:
with open(filename, 'r') as f:
reader = csv.reader(f, delimiter=';')
for i, row in enumerate(reader):
if i == 2:
useful_data = row[2]
break
в вашем коде все еще есть те же опечатки, что и при попытке OP
Мне не нравится инструкция if else и цикл for только для достижения определенной строки. Я надеялся получить что-то вроде того, что @ Jean-FrançoisFabre Fabre опубликовал ниже, но без цикла for
Да, Жан-Франсуа, в первую очередь скопировал некоторые ошибки. @gajendra: Спасибо за разъяснения.
itertools.islice может здесь короче:
with open(filename) as f:
reader = csv.reader(f, delimiter=';')
useful_data = next(islice(reader, 2, None))[2]
Спасибо за понимание. Кстати, я думаю, было бы яснее / полезнее дать имена жестко запрограммированным константам, которые у вас есть для значений строк и столбцов: то есть next(islice(reader, row+1, None))[column]. Кроме того, в Python 3 файлы csv должны быть opened с аргументом ключевого слова newline=''.
@martineau согласен насчет констант
Не совсем. Когда я пытаюсь использовать 'rb' вместо newline='', я получаю _csv.Error: iterator should return strings, not bytes (did you open the file in text mode?).
Будет ли он «работать» без newline, будет зависеть от того, есть ли в файле csv поля со встроенными в них символами новой строки. Для общности, использование newline заставит его работать независимо - и поэтому, на мой взгляд, он лучше / правильнее, потому что он делает меньше предположений о природе считываемых данных.
Вы должны использовать питон? Есть более простые способы сделать это с помощью awk, sed и т. д.