更新 csv 中的州列以在 Python 中显示 IL 而不是伊利诺伊州 - 数据质量

Update State column in a csv to display IL instead of Illinois in Python - Data Quality

我有一个包含“州”列的 CSV 文件,大部分记录的状态为 2 个字符(IL、CA、AZ),但我需要清理的记录很少,拼写了州名(伊利诺伊州) ,加利福尼亚州,亚利桑那州)。任何人都可以建议清理这些状态的代码。目前,我只能对伊利诺伊州进行硬编码,但任何关于代码可重用性的建议都可以将美国所有州固定为 2 个字符。请指教

这是我在 运行 一个包含 ~40k 条记录的 vsc 文件时遇到的错误:

UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 4563: character maps to <undefined>
import geocoder
import unicodecsv
import logging
import time
from geopy.geocoders import Nominatim
pcode=[]
geolocator = Nominatim(user_agent="specify_your_app_name_here")
with open('Bookings.csv') as f:
     reader = csv.DictReader(f)
     for line in reader:
         if line['state'] == "Illinois":
            line['state'] = "IL"
f.to_csv("New_Bookings.csv", index=False)```

我的建议是建立一个这样格式的字典:

states = {
   "Illinois": "IL",
   "IL": "IL"
}

然后不要写一堆 If 语句:

line['state'] = states[line['state']]

或者为了避免像 "IL" 这样的冗余条目:"IL" 您可以检查行 ['state'] 的长度是否大于 2。

实际上有 python package,这可能会有帮助,但我认为使用它会有点矫枉过正。

UTF-8 中的

0x9d 将是附加到前面字符的连续字节。如果前面的字节低于 0x7f,则它不是有效的 UTF-8。 0x9d 不是 Windows 风格编码中的有效字符,例如 ISO-8859-1,其中每个字符都是一个字节。这让我相信该文件实际上是 UTF-8。

unicodecsv 需要字节流来处理:因此为此添加 b 标志以及 r 因为您只想读取:

with open('Bookings.csv', 'rb') as f:

此外,还要在 reader 上指定编码:

csv.DictReader(f, encoding='utf-8')

您正在更改的数据没有保留在内存中。它一次只处理一行。所以为了写入新文件,你必须打开一个csv writer来写入循环内的每一行。所以像这样:

with open('Bookings.csv', 'rb') as f:
     reader = csv.DictReader(f, encoding='utf-8')
     with open(file_name, 'wb') as f_out:
         writer = csv.writer(f_out, encoding='utf-8')
         for line in reader:
             if line['state'] == "Illinois":
                line['state'] = "IL"
             writer.writerow(line)

编辑:所以我查看了一些更常见的 UTF-8 字符,发现只有一个包含 0x9d(准确地说是 0xe2 0x80 0x9d)。这是特殊的结束双引号。打开文件并搜索此 以验证...