我有一个函数(main),从csv文件中获取数据,并将其转换为字典,其键是第一列中的条目,其值是该行中所有其他条目的列表(例如:一行是:2020-12-20,0,0,0,0,206,
,因此键是2020-12-20
,其余条目是列表中的字符串:['0', '0', '0', '0', '206']
):
def main():
import csv
# doses_data_mar_20.csv
dict_doses_by_date = {}
filename_input = str(input("Please enter a .csv file to read: "))
with open(filename_input, "r") as inp, open('doses.csv', 'w') as out:
header = inp.readline()
reader = csv.reader(inp, delimiter=",", quotechar='"')
for line in reader:
dict_doses_by_date[line[0]] = line[1:6]
return dict_doses_by_date
def count_doses_by_date(dict_dose_by_date):
现在我需要定义一个新的函数count_doses_by_date
,它将每个字符串列表作为输入,并将每个字符串列表转换为整数列表,并将所有整数相加以获得它们的总数。然后将其输出到另一个CSV文件。
I tried doing this:
def count_doses_by_date(dict_dose_by_date):
import csv
# doses_data_mar_20.csv
dict_doses_by_date = {}
filename_input = str(input("Please enter a .csv file to read: "))
with open(filename_input, "r") as inp, open('doses.csv', 'w') as out:
header = inp.readline()
reader = csv.reader(inp, delimiter=",", quotechar='"')
for line in reader:
dict_doses_by_date[line[0]] = line[1:6]
for k in dict_doses_by_date:
list_integers = [int(x) for x in dict_doses_by_date[k]]
sum_integers = sum(list_integers)
print_value = "{}, {} n".format(k, sum_integers)
return out.write(print_value)
,但我得到错误,因为一些列表包含字符串,如' 1800 ',其中包含逗号,防止它被转换为整数。我不知道如何在不破坏分隔csv值的逗号的情况下去掉成千上万的逗号
我困. .如何做到这一点呢?
如果你的字符串是"1234"你可以做
int(number, base=base)
得到一个整数。例如:
print(int("1234"))
将打印1234号。
请在这里查看其余文档:https://docs.python.org/3/library/functions.html#int
然后实际实现你想要的,你可以按照其他注释或任何你想要的方式进行,只是循环遍历元素列表并不断添加它们(a+= int("1234")),然后返回总数并将其写入文件。
当然,如果您的字符串有意外的符号,如"thousand commas"那么在调用int()
之前,您需要通过使用replace()
或其他方式删除字符来规范化字符串。
您应该使用pandas库。您可以使用pd.read_csv
直接从文件中获取数据帧,并且可以将第一列设置为索引列。您可以使用df.applymap(lamba x : int(x.replace(',',''))
去掉逗号并将其转换为int,然后执行df.sum(axis = 1)
以获得逐行和。
你愿意试试吗?使用string.isdigit()
来确定它是否是一个数字
line = ['2020-12-20', '0', '0', '0', '0', '206']
filtered_line = [int(e) if e.isdigit() else '' for e in line[1:6]]
print([x for x in filtered_line if x != ''])
输出[0, 0, 0, 0, 206]
编辑我错过了关于千分隔符的部分。在您的用例中,代码可以是这样的:
dict_doses_by_date = {}
reader = [['2020-12-20', '0', '0', '0', '10', '206'], ['2020-12-21', '0', '0', '0', '20', '316'], ['2020-12-22', '0', '0', '0', '30', '1,426']]
for line in reader:
list_integers = [int(x.replace(',', '')) for x in line[1:6]]
dict_doses_by_date[line[0]] = list_integers
print_value = "{}, {} n".format(line[0], sum(list_integers))
print(print_value)
print(dict_doses_by_date)
输出2020-12-20, 216
2020-12-21, 336
2020-12-22, 1456
{'2020-12-20': [0, 0, 0, 10, 206], '2020-12-21': [0, 0, 0, 20, 316], '2020-12-22': [0, 0, 0, 30, 1426]}