Как я могу получить конкретное поле csv файла?
Мне нужен способ получить конкретный элемент (поле) CSV. Скажем, у меня есть CSV со 100 строками и 2 столбцами (разделенная запятая). Первые сообщения электронной почты столбца, пароли второго столбца. Например, я хочу получить пароль электронной почты в строке 38. Мне нужен только элемент из строки 2-го столбца 38...
Скажем, у меня есть файл csv:
[email protected],bbbbb
[email protected],ddddd
Как я могу получить только "ddddd", например?
Я новичок в языке и пробовал некоторые вещи с модулем csv, но я не понимаю...
Ответы
Ответ 1
import csv
mycsv = csv.reader(open(myfilepath))
for row in mycsv:
text = row[1]
Следуя комментариям к SO-запросу здесь, лучшим, более надежным кодом будет:
import csv
with open(myfilepath, 'rb') as f:
mycsv = csv.reader(f)
for row in mycsv:
text = row[1]
............
Обновление: Если то, что фактически хочет OP, является последней строкой в последней строке файла csv, есть несколько апробаций, которые необязательно нужны csv. Например,
fulltxt = open(mifilepath, 'rb').read()
laststring = fulltxt.split(',')[-1]
Это не очень хорошо для очень больших файлов, потому что вы загружаете полный текст в память, но можете быть в порядке для небольших файлов. Обратите внимание, что laststring
может включать символ новой строки, поэтому отключайте его перед использованием.
И, наконец, если то, что хочет OP, это вторая строка в строке n (для n = 2):
Обновление 2:. Теперь это тот же код, что и в ответе от J.F.Sebastian. (Кредит для него):
import csv
line_number = 2
with open(myfilepath, 'rb') as f:
mycsv = csv.reader(f)
mycsv = list(mycsv)
text = mycsv[line_number][1]
............
Ответ 2
#!/usr/bin/env python
"""Print a field specified by row, column numbers from given csv file.
USAGE:
%prog csv_filename row_number column_number
"""
import csv
import sys
filename = sys.argv[1]
row_number, column_number = [int(arg, 10)-1 for arg in sys.argv[2:])]
with open(filename, 'rb') as f:
rows = list(csv.reader(f))
print rows[row_number][column_number]
Пример
$ python print-csv-field.py input.csv 2 2
ddddd
Примечание: list(csv.reader(f))
загружает весь файл в память. Чтобы избежать этого, вы можете использовать itertools
:
import itertools
# ...
with open(filename, 'rb') as f:
row = next(itertools.islice(csv.reader(f), row_number, row_number+1))
print row[column_number]
Ответ 3
Есть интересный момент, который вам нужно поймать о объекте csv.reader(). Объект csv.reader не является типом list
, а не индексируемым.
Это работает:
for r in csv.reader(file_obj): # file not closed
print r
Это не означает:
r = csv.reader(file_obj)
print r[0]
Итак, сначала вам нужно преобразовать в тип списка, чтобы сделать вышеуказанный код.
r = list( csv.reader(file_obj) )
print r[0]
Ответ 4
import csv
def read_cell(x, y):
with open('file.csv', 'r') as f:
reader = csv.reader(f)
y_count = 0
for n in reader:
if y_count == y:
cell = n[x]
return cell
y_count += 1
print (read_cell(4, 8))
Этот пример печатает ячейки 4, 8 в Python 3.
Ответ 5
import csv
inf = csv.reader(open('yourfile.csv','r'))
for row in inf:
print row[1]