Как я могу получить конкретное поле csv-файла?

Мне нужен способ получить конкретный элемент (поле) CSV. Скажем, у меня есть CSV со 100 строками и 2 столбцами (разделенная запятая). Первые сообщения электронной почты столбца, пароли второго столбца. Например, я хочу получить пароль по электронной почте в строке 38. Мне нужен только элемент из строки 2-го столбца …

Скажем, у меня есть файл csv:

aaaaa@aaa.com,bbbbb ccccc@ccc.com,ddddd 

Как я могу получить только «ddddd»?

Я новичок в языке и пробовал некоторые вещи с модулем csv, но я не понимаю …

  • Ошибка EOF Python в raw_input ()
  • Django: значение параметра отображения
  • Я пытаюсь установить psycopg2 на Mac OS 10.6.3; он утверждает, что не может найти «stdarg.h», но я вижу, что он там; что мне делать?
  • Самый безопасный способ преобразования float в integer в python?
  • Прерывание строки вдоль пробела после превышения определенной ширины (Python)
  • Список добавления для многопроцессорности Python
  • Pandas, проверьте, существует ли значение временной метки в повторно сэмплированном 30-минутном временном буфере datetimeindex
  • Область блока в Python
  • 5 Solutions collect form web for “Как я могу получить конкретное поле csv-файла?”

     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 может включать символ новой строки, поэтому laststring его перед использованием.

    И, наконец, если то, что хочет OP, это вторая строка в строке n (для n = 2):

    Обновление 2: теперь это тот же код, что и в ответе от JFSebastian. (Кредит для него):

     import csv line_number = 2 with open(myfilepath, 'rb') as f: mycsv = csv.reader(f) mycsv = list(mycsv) text = mycsv[line_number][1] ............ 
     #!/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] 

    Есть интересный момент, который вам нужно поймать о объекте 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] 
     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.

     import csv inf = csv.reader(open('yourfile.csv','r')) for row in inf: print row[1] 
    Python - лучший язык программирования в мире.