地址范围的Pythonic数据清理

2024-06-02 06:59:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要知道下面的任务是否可以通过Python完成。你知道吗

我有一个4300个地址的列表,每个地址包含一系列地址,如下所示:

  1. 百老汇南8519-21号
  2. 河景大道8700-6号
  3. 当归街822-4号
  4. 北百老汇8442-6号

我想把第一个地址和最后一个地址分开。以1为例,我需要输出8519s百老汇和8521s百老汇,每一行。你知道吗

在某些情况下,比如1和3,我只需要第一个数字的前两位数就可以完成第二个地址。我尝试在Excel中使用文本到列(-),然后连接并向左(单元格,2),但是对于2和4这样的实例,我没有得到正确的地址,我需要地址的前三位数字。有没有办法写一个python脚本来解决这个问题?你知道吗


Tags: 实例文本脚本列表地址情况数字excel
3条回答

谢谢大家的帮助和建议。我就是这样解决的:

import re
import csv
from csv import DictReader

dash_add = []

def get_address_list(file):
    with open(file) as f:
        reader = csv.DictReader(f)
        for row in reader:
            adds = row['Siteaddr']
            if "-" in adds:
                dash_add.append(adds)

z = []

def get_formatted_address(address):
        numeric = address.split(" ")[0]
        text = address.replace(numeric, "").strip()
        start = numeric.split("-")[0]
        end = numeric.split("-")[1]
        end = start[:-len(end)] + end
        return [start + " " + text,  end + " " + text]

get_address_list('./data/map_data_112318.csv')
[z.extend(get_formatted_address(i)) for i in dash_add]

with open('formatted_addresses.csv', 'w') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(['Address'])
    for v in z:
        writer.writerows([[v]])

请尝试以下代码:

addresses=["8519-21 S Broadway","8700-6 Riverview Blvd"]
output=[]
for i in addresses:
    output.append(i[0:i.find('-')]+i[i.find(' '):])
    numEnd=i[i.find('-')+1:i.find(' ')]
    numStart=i[0:i.find('-')-len(numEnd)]+numEnd+i[i.find(' '):]
    output.append(numStart)
print(output)

其中addresses是您给定格式的地址范围列表,output是您想要的数据。你知道吗

假设您的输入.csv文件如下所示:

Address
8519-21 S Broadway
8700-6 Riverview Blvd
822-4 Angelica St
8442-6 N Broadway

你想让它看起来像这样:

First Address,Last Address
8519 S Broadway,8521 S Broadway
8700 Riverview Blvd,8706 Riverview Blvd
822 Angelica St,824 Angelica St
8442 N Broadway,8446 N Broadway

您可以通过使用^{}模块来实现这一点:

from csv import writer

# open both input and output csv
with open("addresses.csv") as csv_in, open("output.csv", "w", newline="") as csv_out:
    csv_writer = writer(csv_out)

    # Skip 'Address' header
    next(csv_in)

    # Write new headers
    csv_writer.writerow(["First Address", "Last Address"])

    # Go through each line in csv
    for line in csv_in:

        # Split ranges from rest of line
        ranges, *rest = line.split()

        # Split ranges themselves
        start, end = ranges.split("-")

        # Get difference between length of numbers
        diff = len(start) - len(end)

        # Create new end address
        end = start[:diff] + end

        # Write new lines to output csv
        csv_writer.writerow([" ".join([start, *rest]), " ".join([end, *rest])])

将结果输出到输出.csv。你知道吗

相关问题 更多 >