【问题标题】:Script extracting information from .txt to .csv to use in Pandas将信息从 .txt 提取到 .csv 以在 Pandas 中使用的脚本
【发布时间】:2016-12-19 14:32:15
【问题描述】:

我正在处理大量文件(价值约 4gb),它们都包含 1 到 100 个具有以下格式的条目(两个 *** 之间是一个条目):

***
Type:status
Origin: @z_rose yes
Text:  yes
URL: 
ID: 95482459084427264
Time: Mon Jul 25 08:16:06 CDT 2011
RetCount: 0
Favorite: false
MentionedEntities: 20776334 
Hashtags: 
***
***
Type:status
Origin: @aaronesilvers text
Text:  text
URL: 
ID: 95481610861953024
Time: Mon Jul 25 08:12:44 CDT 2011
RetCount: 0
Favorite: false
MentionedEntities: 2226621 
Hashtags: 
***
***
Type:status
Origin: @z_rose text
Text:  text and stuff
URL: 
ID: 95480980026040320
Time: Mon Jul 25 08:10:14 CDT 2011
RetCount: 0
Favorite: false
MentionedEntities: 20776334 
Hashtags: 
***

现在我想以某种方式将这些导入 Pandas 以进行质量分析,但显然我必须将其转换为 Pandas 可以处理的格式。所以我想编写一个脚本,将上面的内容转换为 .csv,看起来像这样(用户是文件标题):

User   Type    Origin              Text  URL    ID                Time                          RetCount  Favorite  MentionedEntities  Hashtags
4012987 status  @z_rose yes         yes   Null   95482459084427264  Mon Jul 25 08:16:06 CDT 2011  0           false  20776334            Null
4012987 status  @aaronsilvers text  text Null    95481610861953024   Mon Jul 25 08:12:44 CDT 2011  0           false   2226621            Null   

`

(抱歉格式化,但你明白了) 我真的不知道从哪里开始,因为我对脚本语言非常陌生,哪种脚本语言适合这项任务?我知道一些脚本语言,但不熟悉它们的局限性,宁愿不花几个小时学习一种语言,却发现这是不可能的。你能给我一个正确的方向吗?

提前致谢!

【问题讨论】:

  • “用户”从何而来?它是否在包含该用户数据的文件的名称中?
  • 我撤回我的问题。错过了部分答案。

标签: python pandas text scripting


【解决方案1】:

我建议您在 Pandas 的输入文件中使用逗号而不是空格作为分隔符,特别是因为某些输入值中嵌入了空格。如果您正在使用 Pandas,那么看在上帝的份上,至少要学习 Python 的基础知识。

vars = ['User', 'Type', 'Origin', 'Text', 'URL', 'ID', 'Time', \
    'RetCount', 'Favorite', 'MentionedEntities', 'Hashtags']

user = '12345'
userfileName = '{}.txt'.format(user)

items = {}
for var in vars:
    items[var]=var
print (','.join([items[var] for var in vars]))

first=True
with open(userfileName) as userfile:
    for line in userfile:
        if line.startswith('*'):
            continue
        if line.startswith('Type'):
            if first:
                first=False
            else:
                print (','.join([items[var] for var in vars]))
            items = {}
            for var in vars:
                items[var]=''
            items['User']=user
        p=line.find(':')
        itemName=line[:p]
        itemValue=line[1+p:].strip()
        items[itemName]=itemValue

print (','.join([items[var] for var in vars]))

【讨论】:

    【解决方案2】:

    假设文件有常规的 12 行块,我建议使用以下字典构建方法:

    infile = open(....)
    
    records = []
    
    # Get one 12-line block and split the lines, when possible
    block = [infile.readline().strip().split(':', 1) for i in range(12)]
    
    # Repean as needed
    while block[0][0]:
        # Convert the non-star lines to a dictionary
        records.append(dict(x for x in block if len(x)==2))
        block = [infile.readline().strip().split(':', 1) for i in range(12)]
    
    data = pd.DataFrame(records)
    print(data.columns)
    # Index(['Favorite', 'Hashtags', 'ID', 'MentionedEntities', 
    #        'Origin', 'RetCount','Text', 'Time', 'Type', 'URL'],
    # dtype='object')
    

    【讨论】:

      猜你喜欢
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      • 2022-06-30
      • 1970-01-01
      • 2015-08-18
      • 1970-01-01
      • 1970-01-01
      • 2021-09-23
      相关资源
      最近更新 更多