如何将Python列表中的值提取至Pandas DataFrame
把HDFS风格的列表转成Pandas DataFrame的方法
嘿,这问题我熟!你的列表里每个元素都是类似HDFS ls命令的输出格式,要提取到DataFrame里,关键是先拆分每个字符串的字段,再处理URL编码的时间参数。下面是具体的实现步骤:
步骤1:导入必要的库
我们需要pandas来创建DataFrame,urllib.parse来解码URL里的特殊字符(比如%3A对应冒号:),还有datetime来处理时间格式:
import pandas as pd from urllib.parse import unquote from datetime import datetime
步骤2:定义原始列表并处理每个元素
先把你的原始列表写出来,然后循环遍历每个元素,拆分字段并处理时间:
list_fs = [ 'drwxrwx--- - uname 0 2017-08-25 12:10 hdfs://filepath=2011-01-31 16%3A06%3A09.0', 'drwxrwx--- - uname 0 2017-08-29 14:12 hdfs://filepath=2011-02-28 10%3A00%3A00', 'drwxrwx--- - uname 0 2017-08-29 14:20 hdfs://filepath=2011-03-31 10%3A00%3A00', 'drwxrwx--- - uname 0 2017-08-29 14:32 hdfs://filepath=2011-04-30 10%3A00%3A00', 'drwxrwx--- - uname 0 2018-02-20 13:57 hdfs://filepath=2011-05-31 08%3A00%3A00', 'drwxrwx--- - uname 0 2017-08-29 15:02 hdfs://filep...' ] # 准备一个空列表存储处理后的数据 processed_data = [] for item in list_fs: try: # 拆分字符串:前5个字段用空格分隔,剩下的合并为HDFS路径部分 parts = item.split(maxsplit=5) perm = parts[0] placeholder = parts[1] username = parts[2] size = int(parts[3]) modify_time = datetime.strptime(parts[4], '%Y-%m-%d %H:%M') # 处理HDFS路径里的时间参数 hdfs_part = parts[5] # 提取filepath后面的时间字符串 file_time_str = hdfs_part.split('=')[1] # 解码URL编码的%3A为冒号 decoded_file_time = unquote(file_time_str) # 转成datetime对象(兼容带毫秒和不带毫秒的格式) if '.' in decoded_file_time: file_time = datetime.strptime(decoded_file_time, '%Y-%m-%d %H:%M:%S.%f') else: file_time = datetime.strptime(decoded_file_time, '%Y-%m-%d %H:%M:%S') # 把处理好的字段添加到列表 processed_data.append({ '权限': perm, '占位符': placeholder, '用户名': username, '大小': size, '修改时间': modify_time, '文件时间': file_time, 'HDFS路径': hdfs_part }) except Exception as e: # 处理截断的元素(比如最后一个),标记错误信息避免程序崩溃 print(f"处理元素 '{item}' 时出错: {e}") processed_data.append({ '权限': None, '占位符': None, '用户名': None, '大小': None, '修改时间': None, '文件时间': None, 'HDFS路径': item, '错误信息': str(e) }) # 转成DataFrame df = pd.DataFrame(processed_data) print(df)
步骤3:查看结果
运行后你会得到一个结构清晰的DataFrame,包含所有提取的字段。对于最后那个截断的元素,我们用try-except捕获了错误,标记了错误信息,避免整个程序崩溃。
关键说明
- 使用
split(maxsplit=5)是因为前5个字段都是用单个空格分隔,而最后一个HDFS路径部分包含空格,不能直接全部分割。 unquote函数用来解码URL中的特殊字符,比如把%3A转成:,这样时间格式才能正确解析。- 加入
try-except是为了处理列表中可能存在的不完整数据(比如最后那个截断的元素),增强代码的健壮性。
内容的提问来源于stack exchange,提问作者Tronald Dump
相关产品推荐
相关产品推荐

