12.16
大数据清洗数据如下import re
from datetime import datetime
中国主要城市列表
chinese_cities = [
'北京市', '上海市', '广州市', '深圳市', '杭州市', '南京市', '武汉市', '成都市',
'重庆市', '西安市', '天津市', '苏州市', '郑州市', '长沙市', '沈阳市', '济南市',
'青岛市', '大连市', '宁波市', '无锡市', '福州市', '厦门市', '哈尔滨市', '长春市',
'石家庄市', '太原市', '合肥市', '南昌市', '南宁市', '昆明市', '贵阳市', '兰州市',
'西宁市', '银川市', '乌鲁木齐市', '呼和浩特市', '拉萨市', '香港特别行政区', '澳门特别行政区',
'台湾省台北市', '台湾省高雄市', '台湾省台中市', '台湾省台南市', '台湾省新竹市'
]
模拟IP地址到中文城市的映射(扩展版本,包含常见IP地址)
ip_city_map = {
'106.39.41.166': '北京市',
'183.162.52.7': '上海市',
'10.100.134.244': '广州市',
'116.77.239.141': '深圳市',
'115.193.172.253': '杭州市',
'117.173.0.113': '南京市',
'58.20.14.170': '武汉市',
'199.30.25.88': '成都市',
'106.37.127.231': '重庆市',
'119.131.143.179': '西安市',
'183.39.154.199': '天津市',
'58.241.76.18': '苏州市',
'220.191.6.44': '郑州市',
'39.186.247.142': '长沙市',
'123.125.71.36': '沈阳市',
'114.80.113.189': '济南市',
'124.235.136.186': '青岛市',
'218.60.115.153': '大连市',
'182.254.144.139': '宁波市',
'221.230.154.183': '无锡市',
# 新增常见IP映射
'114.248.224.214': '北京市',
'117.100.231.8': '上海市',
'122.71.75.164': '广州市',
'58.217.142.142': '深圳市',
'113.143.158.241': '杭州市',
'202.119.41.28': '南京市',
'125.119.38.58': '武汉市',
'182.138.128.41': '成都市',
'120.198.231.151': '重庆市',
'112.10.27.228': '西安市',
'182.100.43.246': '天津市',
'101.38.157.182': '苏州市',
'115.174.68.92': '郑州市',
'125.81.90.200': '长沙市',
'116.213.171.153': '沈阳市',
'140.205.253.135': '济南市',
'58.48.139.85': '青岛市',
'183.45.18.241': '大连市',
'112.16.92.55': '宁波市',
'222.35.76.74': '无锡市'
}
IP地址转换为中文城市函数
def ip_to_city(ip):
# 如果IP在映射表中,返回对应的城市名称
if ip in ip_city_map:
return ip_city_map[ip]
# 否则返回None,表示未知城市
return None
日期格式转换函数
def convert_date_format(date_str):
# 原始格式: 10/Nov/2016:00:01:02 +0800
# 目标格式: 2016-11-10 00:01:02
try:
dt = datetime.strptime(date_str, "%d/%b/%Y:%H:%M:%S %z")
return dt.strftime("%Y-%m-%d %H:%M:%S")
except Exception as e:
print(f"日期转换错误: {e}, 原始日期: {date_str}")
return date_str
主函数
def main():
input_file = "result.txt"
output_file = "cleaned_data.txt"
f_in = open(input_file, 'r', encoding='utf-8')
f_out = open(output_file, 'w', encoding='utf-8')
line_count = 0
kept_count = 0
dropped_count = 0
for line in f_in:
line_count += 1
# 去除行首的行号和箭头 (如 "1→"), 然后分割数据
line = line.strip()
if line:
# 移除行号前缀
if '→' in line:
line = line.split('→', 1)[1]
# 按逗号分割字段
fields = line.split(',')
if len(fields) == 6:
ip = fields[0].strip()
date_str = fields[1].strip()
day = fields[2].strip()
traffic = fields[3].strip()
type_ = fields[4].strip()
id_ = fields[5].strip()
# 转换日期格式
converted_date = convert_date_format(date_str)
# 将IP地址转换为中文城市
city = ip_to_city(ip)
# 只保留已知城市的数据
if city is not None:
# 构建清洗后的数据行 (使用制表符分隔,适合Hive导入)
cleaned_line = f"{city}\t{converted_date}\t{day}\t{traffic}\t{type_}\t{id_}\n"
f_out.write(cleaned_line)
kept_count += 1
else:
dropped_count += 1
else:
print(f"第 {line_count} 行字段数量错误: {line}")
dropped_count += 1
f_in.close()
f_out.close()
print(f"数据清洗完成!")
print(f"输入文件总行数: {line_count}")
print(f"保留已知城市行数: {kept_count}")
print(f"剔除未知城市行数: {dropped_count}")
print(f"清洗后文件: {output_file}")
if name == "main":
main()

浙公网安备 33010602011771号