如何从 Python 中的数据中删除多余的逗号

Posted

技术标签:

【中文标题】如何从 Python 中的数据中删除多余的逗号【英文标题】:How to remove extra commas from data in Python 【发布时间】:2020-02-20 01:57:13 【问题描述】:

我有一个 CSV 文件,我试图通过该文件将数据加载到包含 2 列的 SQL 表中。我有 2 列,数据用逗号分隔,用于标识下一个字段。第二列包含文本和该文本中的一些逗号。 由于额外的逗号,我无法将数据加载到我的 SQL 表中,因为它看起来有额外的列。我有数百万行数据。如何删除这些多余的逗号?

数据:

Number Address
"12345" , "123 abc street, Unit 345"
"67893" , "567 xyz lane"
"65432" , "789 unit, mno street"

我想删除随机行中地址中多余的逗号。

【问题讨论】:

Read CSV file with comma within fields in Python的可能重复 我不需要看逗号,我想用空格替换第二列中多余的逗号。 如果您使用 csv 库,它将将该行读取为只有两列。您是在使用 csv 库,还是只是用逗号分隔? 我用逗号分开。不使用库。 用逗号读取,后面替换。 【参考方案1】:

如果您的所有数据都采用相同的格式,如Number Address "000" , "000 abc street, Unit 000",您可以拆分列表,删除逗号,然后将列表重新组合在一起,使其再次成为字符串。例如使用您提供的数据:

ori_addr = "Number Address \"12345\" , \"123 abc street, Unit 345\""
addr = ori_addr.split()
addr[6] = addr[6].replace(",", "")
together_addr = " ".join(addr)

together_addr 等于 "Number Address "12345" , "123 abc street Unit 345" 注意 "street" 和 "Unit" 之间没有逗号。

【讨论】:

并非所有地址的格式都相同。他们在随机位置的地址中有逗号。 如果地址都采用相同的格式,事情会容易得多。您能否展示一些其他地址格式的示例? 并非所有地址都包含逗号。一些不使用逗号的地址示例如下:Unit 123、456 Street 或 Street 789、abc road 等。 抱歉,如果您尝试在没有静态格式的情况下执行此任务,您将需要一些相当复杂的代码。也许尝试将它们全部保存为某种格式,以便您可以轻松地将某些操作应用于它们。【参考方案2】:

编辑:

根据用户的 cmets,向此测试添加了失败地址。此地址加载到数据库没有问题。 添加了将 CSV 地址存储到 mysql 中的代码。

答案:

以下代码执行以下操作:

MySQL 数据库engine(连接)已创建。 从 CSV 文件中读取的地址数据(编号、地址)。 从源数据中替换了非字段分隔逗号,并删除了多余的空格。 编辑后的数据输入DataFrame DataFrame 用于将数据存储到 MySQL 中。
    import csv
    import pandas as pd
    from sqlalchemy import create_engine

    # Set database credentials.
    creds = 'usr': 'admin',
             'pwd': '1tsaSecr3t',
             'hst': '127.0.0.1',
             'prt': 3306,
             'dbn': 'playground'
    # MySQL conection string.
    connstr = 'mysql+mysqlconnector://usr:pwd@hst:prt/dbn'
    # Create sqlalchemy engine for MySQL connection.
    engine = create_engine(connstr.format(**creds))

    # Read addresses from mCSV file.
    text = list(csv.reader(open('comma_test.csv'), skipinitialspace=True))

    # Replace all commas which are not used as field separators.
    # Remove additional whitespace.
    for idx, row in enumerate(text):
        text[idx] = [i.strip().replace(',', '') for i in row]

    # Store data into a DataFrame.
    df = pd.DataFrame(data=text, columns=['number', 'address'])
    # Write DataFrame to MySQL using the engine (connection) created above.
    df.to_sql(name='commatest', con=engine, if_exists='append', index=False)

源文件(comma_test.csv):

"12345" , "123 abc street, Unit 345"
"10101" , "111 abc street, Unit 111"
"20202" , "222 abc street, Unit 222"
"30303" , "333 abc street, Unit 333"
"40404" , "444 abc street, Unit 444"
"50505" , "abc DR, UNIT# 123 UNIT 123"

未经编辑的数据:

['12345 ', '123 abc street, Unit 345']
['10101 ', '111 abc street, Unit 111']
['20202 ', '222 abc street, Unit 222']
['30303 ', '333 abc street, Unit 333']
['40404 ', '444 abc street, Unit 444']
['50505 ', 'abc DR, UNIT# 123 UNIT 123']

编辑数据:

['12345', '123 abc street Unit 345']
['10101', '111 abc street Unit 111']
['20202', '222 abc street Unit 222']
['30303', '333 abc street Unit 333']
['40404', '444 abc street Unit 444']
['50505', 'abc DR UNIT# 123 UNIT 123']

从 MySQL 查询:

number  address
12345   123 abc street Unit 345
10101   111 abc street Unit 111
20202   222 abc street Unit 222
30303   333 abc street Unit 333
40404   444 abc street Unit 444
50505   abc DR UNIT# 123 UNIT 123

致谢:

这是一个冗长的方法。但是,为了清楚地显示所涉及的步骤,我们特意对每个步骤进行了细分。

【讨论】:

这对我不起作用。当我在我的 sql 中加载数据时,我仍然收到错误消息,该特定行包含的数据多于我的数据中的输入列。 它说的是更多数据,因为对于中间有逗号的地址,它会将其读取为多列而不是一列。 @Sara - 检查有问题的数据行。这段代码替换了所有逗号,所以我不相信这是问题所在。请在您的原始问题中发布违规行,然后我们可以编写代码来考虑这些情况。公平地说,它适用于您给出的示例。 这是它给出错误的行之一:“abc DR, UNIT# 123 UNIT 123”。我认为它不会在替换后将结果保存在 csv 中。 @Sara - 已确认评论。我已将失败地址添加到测试中,并包含用于将数据存储到 MySQL 的代码。此外,此地址可能会失败,因为没有“数字”,它只有“地址”字段。这是一个很好的例子,说明为什么在开始处理源数据之前对源数据进行清理非常重要

以上是关于如何从 Python 中的数据中删除多余的逗号的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Python 数组中删除多余的空格? [复制]

Python:从列表中删除逗号,以便我可以使用 pandas 将数据导入 Excel 中的单独单元格

拼接字符串时,去掉最后一个多余的逗号

在 Python 中删除字符串中的多余字符

如何从 Postgres 中的字符串中删除 '\t'、'\n' 或多余的空格?

如何删除 D3 轴刻度中的逗号并删除最后一个刻度?