Python csv列中的连字符/导致int转换错误的未知数据

Python csv列中的连字符/导致int转换错误的未知数据,python,csv,Python,Csv,我知道如何在数据类型之间转换。不幸的是,数据中的某些内容妨碍了清理过程中我的str到int转换 当我不强制转换为int时,我的代码正常执行。当我检查csv文件时,我意识到在BeginDate和EndDate列中有连字符。我原以为这就是我的ValueError的原因,但从评论中了解到情况并非如此 原始文本 根据注释部分,您发现括号表示负数。几乎可以肯定,您有一个不是整数类型的单元格。找到问题的一个简单方法是将转换包装为try/except。现在,只需打印单元格-稍后,您需要决定如何处理它

我知道如何在数据类型之间转换。不幸的是,数据中的某些内容妨碍了清理过程中我的
str
int
转换

当我不强制转换为
int
时,我的代码正常执行。当我检查csv文件时,我意识到在
BeginDate
EndDate
列中有连字符。我原以为这就是我的
ValueError
的原因,但从评论中了解到情况并非如此

原始文本



根据注释部分,您发现括号表示负数。几乎可以肯定,您有一个不是整数类型的单元格。找到问题的一个简单方法是将转换包装为try/except。现在,只需打印单元格-稍后,您需要决定如何处理它

from csv import reader
opened_file = open('/Users/tymac/Artworks.csv')
read_data = reader(opened_file)
moma = list(read_data)
moma_header = moma[0]
moma = moma[1:]

for row in moma:
    bd = row[5]
    bd = bd.replace("(", "")
    bd = bd.replace(")", "")
    try:
        bd = int(bd)
    except ValueError:
        print(bd) # Just to find your bad cell, otherwise choose what to do with it. 
例如,如果我有一个包含以下数据的csv

FName, LName, Number
James, Jones, (20)
Sam, Smith, (30)
Someone, Else, nan

我运行代码(改为第[2]行而不是第[5]行),我将得到一个打印结果“nan”,因为转换为int失败。这告诉我,我有一行包含的不是iteger

添加我自己的答案,因为这是代码中的解决方案。SteveJ的评论让我问自己一些问题,结果产生了绝对过滤,所以我把他的答案标记为正确

我不知道带前导零的数字在Python中不是整数。一些单元格以前导零开始,看起来肯定像一个整数,例如
0196
。此外,我尝试使用
0000
作为未知日期的占位符单元格。Python中前导零规则的例外是包含所有零的数字,如
0000
。但是,由于我在其他条件下过滤掉了零,所以使用
1111
作为占位符整数更安全

我必须积极地进行清理,并创建过滤器,消除所有可能的异常值,即使我看不到它们。一个“以防万一过滤器”,用于过滤掉所有没有留下4位数字字符串的内容。现在我有4位年份整数,带有
1111
integer占位符单元格,所以一切都很好

最后,我能够用这些过滤器来清洁它

def clean_date(string):
    bad_chars = ["(", ")", "\n", "\r", "\t"]
    for char in bad_chars:
        string = string.replace(char, "")
    if len(string) > 4:
        string = string[:4]
    elif len(string) < 4:
        string = "1111" # Don't use "0000" for padding, placeholders etc.
    elif " " in string:
        string = "1111"
    elif string.isdigit() == False: 
        string = "1111"
    elif len(string.split('1', 1)[0]):
        string = "1111"
    return string

for row in moma:
    bd = row[5] # BeginDate/Birth Date
    bd = clean_date(bd)
    bd = int(bd) # Conversion

    if row == moma[0]:
    print(bd)
    print(type(bd))

 # Date of birth as an int
 # 1841 <class 'int'>
def clean_日期(字符串):
坏字符=[“(“,”),“\n”,“\r”,“\t”]
对于坏字符中的字符:
string=string.replace(字符,“”)
如果长度(字符串)>4:
字符串=字符串[:4]
elif len(字符串)<4:
string=“1111”#不要将“0000”用作填充、占位符等。
字符串中的elif“”:
string=“1111”
elif string.isdigit()==False:
string=“1111”
elif len(string.split('1',1)[0]):
string=“1111”
返回字符串
对于moma中的行:
bd=第[5]行#出生日期/出生日期
bd=清洁日期(bd)
bd=int(bd)#转换
如果行==moma[0]:
打印(bd)
打印(类型(bd))
#出生日期作为整数
# 1841 

您是否查看了原始csv,而不是从excel查看?有时负数用括号表示。我想知道你的情况是否如此。我会用记事本之类的东西打开csv,看看原始数据是什么样子。哇。我不知道。是的,的确是
(1841)
。为什么我不能转换成int呢?我没有答案。也许在这里粘贴一个原始数据的样本,它可能会增加一些光线。尝试在int转换之前放置一条print(bd)语句,以查看值的外观。为了进行测试,请在Try/except块中围绕对int的转换。在except块中,打印bd。它将告诉您发生故障的单元格。我想你会发现在你的一行中,单元格不是整数,所以标题中的“连字符”一点也不正确,你实际上是在问括号的问题?如果是,请修复标题。因为在您编辑的代码中,您没有转换为int。它实际上没有说明任何事情。我认为你的问题可能是另一场争吵。如图所示运行代码有助于识别这一点。我想你会得到一个bd值,这显然不是一个整数,然后它会变得清晰。谢谢。我想说的是,在我的代码中,如果row==moma[0],我只在第一行循环一次。那是我的编辑,所以你可能没看到。因此,即使有一些坏数据,这也应该很重要,因为我在
moma[0]
上只循环了一次。我添加了异常块,VS代码返回了所有的生日。我不知道你要我找什么。我看到一些空格,但我没有遍历这些行。同样,您在编辑后不会看到错误,因为您没有转换为int。如果返回原始代码并返回原始错误,则会得到ValueError。我断言这是由于一个坏的单元格,我在这里发布的代码有助于找到那个坏的单元格。对不起,我不知道该怎么说才好。恐怕这就是我给你的一切:)
def clean_date(string):
    bad_chars = ["(", ")", "\n", "\r", "\t"]
    for char in bad_chars:
        string = string.replace(char, "")
    if len(string) > 4:
        string = string[:4]
    elif len(string) < 4:
        string = "1111" # Don't use "0000" for padding, placeholders etc.
    elif " " in string:
        string = "1111"
    elif string.isdigit() == False: 
        string = "1111"
    elif len(string.split('1', 1)[0]):
        string = "1111"
    return string

for row in moma:
    bd = row[5] # BeginDate/Birth Date
    bd = clean_date(bd)
    bd = int(bd) # Conversion

    if row == moma[0]:
    print(bd)
    print(type(bd))

 # Date of birth as an int
 # 1841 <class 'int'>