Укажите одну ячейку в CSV-файле в Python - PullRequest
0 голосов
/ 12 марта 2019

Я борюсь с одним куском этого кода и не могу понять, что это правильно. Я пытаюсь получить доступ и напечатать значение одной ячейки из CSV в Python. У меня есть список строк и столбцов для указания каждой отдельной ячейки, но я сталкиваюсь с ошибками индекса при попытке превратить файл в список, а затем указать [row] [column]. В любом случае я могу получить значения str одной ячейки без использования панд? Я бы предпочел использовать модуль CSV, если это возможно

import csv
from csv import reader
import json

categories = { '1':'Unacceptable', '2':'Edit'}

def get_annotation_input():
    while True:
        try:
            annotation = int(input("Annotation: "))
            if annotation not in range (1,3):
                raise ValueError
            return annotation
        except ValueError:
            print("Enter 1 or 2") 


def annotate():
    annotator = input("What is your name? ")
    print(''.join(["-"]*50))

    with open('annotations_full.csv', 'rU') as infile:
              response_reader = csv.DictReader(infile)
              responses = {}
              for row in response_reader:
                  for header, response in row.items():
                      try:
                          responses[header].append(response)
                      except KeyError:
                          responses[header] = [response]


              for i in range(len(ROWS)):
                  ROWS[i] = int(ROWS[i])
              COLUMNS = responses['question_number']
              csv_file = csv.reader(open('results.csv'))
              header = next(csv_file)
              text_question = next(csv_file)
              for i in range(len(COLUMNS)):
                  COLUMNS[i] = (header.index(COLUMNS[i]))
              #print(ROWS,COLUMNS)

              for i,j in zip(ROWS,COLUMNS):
                  current_row = i
                  current_column = j
                  print("Current row number: ", current_row)
                  print("Annotate the following answer as 1-Unacceptable, 2-Edit")
                  print(header[current_column])
                  print(text_question[current_column], '\n')
                  #WANT TO PRINT SINGLE SPECIFIED CELL TEXT[CURRENT_ROW][CURRENT COLUMN] FROM CSV HERE 
                  annotation = get_annotation_input()
                  if annotation == 2:
                      edited_response = input("Edit the response: " )
                  else:
                      edited_response = "CAN NOT BE EDITED"

                      with open("annotations.json", mode='a') as annotation_file:
                          annotation_data = {'annotator' : annotator, 'row_number': current_row, 'question_number': header[current_column], 'annotation' : categories[str(annotation)], 'edited' : edited_response}
                          json.dump(annotation_data, annotation_file)
                          annotation_file.write('\n')



if __name__ == "__main__":
    annotate()

CSV-файл 'annotations_full.csv CSV-файл 'results.csv'

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

Фрагмент кода ниже фокусируется на доступе к ячейкам results.csv, основанным на координатах, предоставленных в annotations_full.csv

Сначала создается список диктов (OrderedDicts с Python 3.6) путем итерации по csv.DictReader экземпляр на results.csv.

Затем он перебирает экземпляр DictReader на annotations_full.csv, выбирая координаты для поиска ячеек results.csv и печатает содержимое ячейкивместе с некоторыми мерами предосторожности для недопустимых имен столбцов и номеров строк.
Обратите внимание на [rnum - 1], используемый для предоставления индекса для списка result_content.Списки Python начинаются с нуля;кроме случаев, когда номера строк в annotations_full.csv учитывают это (например, первая строка в results.csv указана с номером строки 0), вам это необходимо для доступа к правильному элементу списка.

import csv

annos = "annotations_full.csv"
results = "results.csv"

with open(results) as r:
    result_content = [row for row in csv.DictReader(r)]

with open(annos) as a:
    for row in csv.DictReader(a):
        rnum = int(row['row_number'])
        qnum = row['question_number']
        print("Result for question {} row {}:".format(qnum, rnum)
        try:
            print(result_content[rnum - 1][qnum])
        except KeyError:
            print("no column '{}' in {}".format(qnum, results))
        except IndexError:
            print("column '{}' has no row {} in {}".format(qnum, rnum, results))

Содержимоеобразца annotations_full.csv:

row_number,question_number
5,Q5.3
6,Q5.1
2,Q2.1
1,Q3.3

Содержимое образца results.csv:

Q5.3,Q5.1,Q2.1,Q3.3
result Q5.3-1,result Q5.1-1,result Q2.1-1,result Q3.3-1
result Q5.3-2,result Q5.1-2,result Q2.1-2,result Q3.3-2
result Q5.3-3,result Q5.1-3,result Q2.1-3,result Q3.3-3
result Q5.3-4,result Q5.1-4,result Q2.1-4,result Q3.3-4
result Q5.3-5,result Q5.1-5,result Q2.1-5,result Q3.3-5
result Q5.3-6,result Q5.1-6,result Q2.1-6,result Q3.3-6

Вывод фрагмента кода с использованием файлов примеров:

Result for question Q5.3 row 5:
result Q5.3-5
Result for question Q5.1 row 6:
result Q5.1-6
Result for question Q2.1 row 2:
result Q2.1-2
Result for question Q3.3 row 1:
result Q3.3-1
0 голосов
/ 12 марта 2019

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

CSV-файл: simple.csv

name,department,birthday month
John Smith,Accounting,November
Erica Meyers,IT,March

Python-код для доступа к указанному коду:

import csv
with open('simple.csv', newline='') as csvfile:
    temp_reader = csv.reader(csvfile, delimiter=',')
    data = list(temp_reader)
row_val, col_val = 2, 1
try:
    print(data[row_val][col_val])
except IndexError:
    print('No data found')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...