Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将文本文件转换为带有列的csv_Python_Python 3.x_Pandas - Fatal编程技术网

Python 将文本文件转换为带有列的csv

Python 将文本文件转换为带有列的csv,python,python-3.x,pandas,Python,Python 3.x,Pandas,我想将文本文件转换为csv文件,其中包含名称、日期、描述等列 我是python新手,所以没有一个合适的方法来做这件事,有人可以指导我。 下面是示例文本文件 ================================================== ==== Title: Whole case Location: oyuri From: Aki Date: 2018/11/30 (Friday) 11:55:29 ====================================

我想将文本文件转换为csv文件,其中包含名称、日期、描述等列 我是python新手,所以没有一个合适的方法来做这件事,有人可以指导我。 下面是示例文本文件

================================================== ====
Title: Whole case
Location: oyuri
From: Aki 
Date: 2018/11/30 (Friday) 11:55:29
================================================== =====
1: Aki 
2018/12/05 (Wed) 17:33:17
An approval notice has been sent.
-------------------------------------------------- ------------------
2: Aki
2018/12/06 (Thursday) 17:14:30
I was notified by Mr. Id, the agent of the other party.

-------------------------------------------------- ------------------
3: kano, etc.
2018/12/07 (Friday) 11:44:45
Please call rito.
-------------------------------------------------- ------------------

我在下面概述了一种实现任务的非常简单的方法。总的想法是:

  • 使用
    open()
  • 将文本拆分为
    列表
  • 隔离
    列表中每个元素中的信息
  • 使用
    pandas
  • 我建议使用Jupyter笔记本电脑更好地了解我在这里所做的工作

    将熊猫作为pd导入
    #打开文件并提取文本
    text_path='text.txt'
    打开(文本路径)作为f:
    text=f.read()
    #将文本拆分为列表
    行=文本。拆分('\n')
    #删除标题
    len_航向=6
    行=行[6:]
    #使用分隔符分离信息
    除法器='-'
    数据=[]
    开始=0
    对于i,枚举中的行(行):
    #如果发现分隔符,则向数据添加元素
    如果行开始使用(分隔符):
    data.append(行[start:i])
    开始=i+1
    #从数据中提取名称、日期和描述
    名称、日期、说明=[]、[]、[]
    有关数据中的信息:
    #这是一个非常简单的方法,请添加检查
    #以确保获得正确的数据
    名称=信息[0][2:]
    日期=信息[1][:11]
    desc=信息[2]
    name.append(name)
    日期。附加(日期)
    description.append(desc)
    #创建数据帧
    df=pd.DataFrame({'name':名称,'date':日期,'description':description})
    #将数据帧导出到csv
    df.to_csv('converted_text.csv',index=False)
    
    你应该得到一个CSV文件,看起来像这样

  • 查找包含msg sep行的行,例如“----”、“=======”
  • 然后使用
    np.where(cond,1,0).cumsum()
    标记每个单独的消息
  • 过滤不带“----”或“==========”的行
  • groupby标记,并使用sep'\n'连接,然后使用str.split展开列

  • 输出:

                  name                            date  \
    tag                                                  
    2.0        1: Aki        2018/12/05 (Wed) 17:33:17   
    3.0         2: Aki  2018/12/06 (Thursday) 17:14:30   
    4.0  3: kano, etc.    2018/12/07 (Friday) 11:44:45   
    
                                               Description  
    tag                                                     
    2.0                  An approval notice has been sent.  
    3.0  I was notified by Mr. Id, the agent of the oth...  
    4.0                                  Please call rito.  
    
    df:


    您可以继续处理该名称:

    obj = df_output['name'].str.strip().str.split(':\s*')
    df_output['name'] = obj.str[-1]
    df_output['idx'] = obj.str[0]
    df_output = df_output.set_index('idx')
    

    添加更多标题列:

    cond = (df['tag'] == 1) & (df[0].str.contains(':'))
    header_dict = dict(df.loc[cond, 0].str.split(': ', n=1).values)
    
        # {'Title': 'Whole case',
        #  'Location': 'oyuri',
        #  'From': 'Aki ',
        #  'Date': '2018/11/30 (Friday) 11:55:29'}
    
    for k,v in header_dict.items():
        df_output[k] = v
    

    谢谢你的帮助。它部分地起作用了。工作-数据现在在非工作-1列中分开。说明列为空2。上面缺少一些条目(感谢您的回答,Ferris.:)这是完全正常的工作,我们想添加什么标题内容以及??在Name列(From:i.e aki)Date In Date列和Description中的其余部分。我正在尝试这样做。非常感谢,FerrisI正在尝试使索引和名称列有所不同,但我无法使用上述代码做到这一点。您可以发布一个新问题,并描述细节。是的,我肯定会这样做。谢谢费里斯
    obj = df_output['name'].str.strip().str.split(':\s*')
    df_output['name'] = obj.str[-1]
    df_output['idx'] = obj.str[0]
    df_output = df_output.set_index('idx')
    
               name                            date  \
    idx                                               
    1           Aki       2018/12/05 (Wed) 17:33:17   
    2           Aki  2018/12/06 (Thursday) 17:14:30   
    3    kano, etc.    2018/12/07 (Friday) 11:44:45   
    
                                               Description  
    idx                                                     
    1                    An approval notice has been sent.  
    2    I was notified by Mr. Id, the agent of the oth...  
    3                                    Please call rito.
    
    cond = (df['tag'] == 1) & (df[0].str.contains(':'))
    header_dict = dict(df.loc[cond, 0].str.split(': ', n=1).values)
    
        # {'Title': 'Whole case',
        #  'Location': 'oyuri',
        #  'From': 'Aki ',
        #  'Date': '2018/11/30 (Friday) 11:55:29'}
    
    for k,v in header_dict.items():
        df_output[k] = v