在python中的csv文件中指定单个单元格

问题描述 投票:0回答:2

我正在努力解决这段代码的一部分,似乎无法做到正确。我试图从python中的csv访问和打印单个单元格值。当我尝试将文件转换为列表然后指定[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 file 'annotations_full.csv CSV file 'results.csv'

python excel csv
2个回答
0
投票

如果要访问/查看/打印指定的单元格值,则可以执行以下操作:

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')

0
投票

下面的代码片段重点是根据results.csv中提供的坐标访问annotations_full.csv的单元格

它首先通过迭代csv.DictReader上的results.csv实例创建一个dicts列表(截至Python 3.6的OrderedDicts)。

然后迭代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
© www.soinside.com 2019 - 2024. All rights reserved.