Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我的Python代码认为变量是str,而它应该是int?_Python_String_Integer_Typeerror - Fatal编程技术网

为什么我的Python代码认为变量是str,而它应该是int?

为什么我的Python代码认为变量是str,而它应该是int?,python,string,integer,typeerror,Python,String,Integer,Typeerror,所以我们在课堂上制作了一个Python程序,在这个程序中我们提取了关于道路事故的数据。 我们从中提取的文件是一个表,每一行都提供了特定事故中涉及人员的信息 usagers_2016 = open('usagers_2016.csv','w',encoding='utf8', errors='ignore', newline="\n") usagers_2016.write("Num_Acc;place;catu;grav;sexe;trajet;secu;locp;

所以我们在课堂上制作了一个Python程序,在这个程序中我们提取了关于道路事故的数据。 我们从中提取的文件是一个表,每一行都提供了特定事故中涉及人员的信息

usagers_2016 = open('usagers_2016.csv','w',encoding='utf8', errors='ignore', newline="\n")
usagers_2016.write("Num_Acc;place;catu;grav;sexe;trajet;secu;locp;actp;etatp;an_nais;num_veh\n
201600000001;1;1;1;2;0;11;0;0;0;1983;B02\n
201600000001;1;1;3;1;9;21;0;0;0;2001;A01\n
201600000002;1;1;3;1;5;11;0;0;0;1960;A01\n
201600000002;2;2;3;1;0;11;0;0;0;2000;A01\n
201600000002;3;2;3;2;0;11;0;0;0;1962;A01\n
201600000003;1;1;1;1;1;11;0;0;0;1997;A01\n")

next(usagers_2016)

dict_acc = {}

for ligne in usagers_2016.readlines():
    ligne = ligne[:-2].split(";")
我选择在词汇表中提取信息,其中事故是关键,每个关键的值是一个列表,其第一个元素是相关人员的列表,每个人由一个列表表示,其中包括他们的性别和出生年份

    if ligne[0] not in dict_acc.keys():
        dict_acc[ligne[0]] = [[],0,0,0,0]
    dict_acc[ligne[0]][0].append([ligne[4],ligne[10]])

usagers_2016.close()

for accident in dict_acc:
    accident[1] = len(accident[0]) # TypeError: 'str' object does not support item assignment

我的问题如下:作为主列表的第二个元素(键的值),我想添加每个事故涉及的人数(即列表第一个元素(列表)的
len()
)。但是,在代码运行期间发现,前0(前一个代码摘录的第2行)被视为
str
,无法接收任何项目分配。问题是它应该是
int
!!!!我认为将
int
类型解释为如下
dict_acc[ligne[0]=[],int(0),int(0),int(0),int(0)]
可以纠正它,但不,我的0仍然被认为是字符串。你知道为什么吗?

原因是你正在用open读取文件,你有一个类型为
\u io.TextIOWrapper
的对象,每一行都是一个字符串,你稍后会根据delimeter
';'

next(usagers_2016)
让我觉得您正在删除带有标题的第一行

因此,您可以改为在Pandas中以数据帧的形式打开此csv,如下所示:

import pandas as pd
df = pd.read_csv ('usagers_2016.csv', sep=';')
# To remove the tailing \n
df.columns=df.columns.str.replace(r'\n','')
df.replace(r'\\n','', regex=True)

# Now to calculate the number of people involve in each accident you can
df.groupby(['Num_Acc']).size()

好的,问题是我打的是
incident[1]
而不是
dict\u acc[incident][1]

解决办法是

for accident in dict_acc:
    dict_acc[accident][1] = len(dict_acc[accident][0])

我感谢@MisterMiyagi

您可以发布一个
usagers_2016.csv的示例,以便其他人可以运行代码,另外,fwiw您最好使用
csv阅读此文件。reader
您能解释一下您在代码中的哪一行获得了该文件吗error@NirElbaz错误在最后一行:TypeError:“str”对象不支持项分配
split()
返回字符串列表。即使字符串完全由数字组成,也是如此。对希望为数字的列值进行代码调用
int()
。并且要为数据不是你所期望的情况做好准备。你在这方面到底想做什么,或者为什么你期望它能起作用还不清楚。你能澄清一下吗?注意,dict_acc中的事故:
将迭代字典的键,正如您自己所说的“事故是关键所在”。对于第一个条目,
意外
键是
“20160000001”
,因此
意外[1]
键是
“0”
,您的代码尝试设置此项。即使钥匙是数字,这也没有意义。虽然字符串不支持项赋值,但数字完全没有项的概念。这并不能解决它们的操作
意外[1]=len(意外[0])
没有意义的问题,不管它是在字符串还是整数上执行的。@mistermiagi您是对的,没有解决这个问题。通过我的回答,用户至少可以获得不同列中的字段。我相信现在她正在尝试按键分组,这是她的文件
Num_Acc
中的第一列,以及在事故中受伤的人数,我相信这是
catu
列。问题是,她尝试采用的方法将非常复杂,当使用数据帧时,她的操作看起来更直观,甚至更容易让人怀疑,除非熟悉熊猫,否则像
df.columns.str.replace(r'\\n','')
这样的操作特别直观。(我也不明白为什么你删除了
r'\\n'
而不是
'\n'
)不管是哪种方式,不管直观与否,它都不会以任何方式解决问题。@MisterMiyagi在她共享的文件中,每行末尾都有一个额外的
\n
,即使是标题。如果她确认了她想要达到的计数,我将编辑我的ANW。问题中显示的数据包含
\n
,也就是一个换行符
r'\\n'
是三个字符,即
\
\
n
,因为
r
禁用转义,而
\
将是转义的
\