我正在努力解决这段代码的一部分,似乎无法做到正确。我试图从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文件: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')
下面的代码片段重点是根据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