Как я могу получить конкретное поле 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]