Python将txt文件读入数据帧

时间:2015-11-25 09:27:40

标签: python pandas

我正在尝试将txt文件(整个目录)摄取到pandas数据帧中,以便数据框中的每一行都包含一个文件的内容。

据我所知,文本文件没有分隔,它们是电子邮件的正文。除了一个文件之外的所有文件都分成许多行。所以我没有20行(每个文件一行),而是有500多行。我不知道这个文件与其他文件有什么不同。它们都是纯文本。

我使用的代码是:

import pandas as pd 

for i in files:
    list_.append(pd.read_csv('//directory'+i ,sep="\t" , quoting=csv.QUOTE_NONE,header=None,names=["message", "label"]))

我已经将分隔符设置为表格,因为我认为它根本不会影响文本的摄取。 任何想法问题在这里?

2 个答案:

答案 0 :(得分:4)

您正在将电子邮件作为CSV文件阅读,因此文件内容将为:

  1. 在每个标签分隔符处拆分以创建列;无论你选择哪个分隔符,我都怀疑这将是一个糟糕的选择,因为任何角色都可能出现在你的电子邮件正文中;

  2. 电子邮件中的每个换行符都会创建一个新行(可能会解释您的500行)

  3. 由于电子邮件不是CSV文件,为什么不编写自己的函数将每个文件单独读入字符串,然后从所有这些字符串中创建数据框。例如,要将当前目录中的所有文件读为字符串:

    data = []
    path = '.'
    files = [f for f in os.listdir(path) if os.path.isfile(f)]
    for f in files:
      with open (f, "r") as myfile:
        data.append(myfile.read())
    
    df = pd.DataFrame(data)
    

    以下是 in action 的示例:

    $ ls .
    test1.txt  test2.txt  load_files.py
    
    $ cat load_files.py 
    
    import pandas as pd
    import os
    
    data = []
    path = '.'
    files = [f for f in os.listdir(path) if os.path.isfile(f)]
    for f in files:
      with open (f, "r") as myfile:
        data.append(myfile.read())
    
    df = pd.DataFrame(data)
    print df
    
    
    $ cat test1.txt 
    asdasd
    ada
    adasd
    
    $ cat test2.txt 
    sasdad
    asd
    dadaadad
    
    $ python load_files.py 
                                                       0
    0                               asdasd\nada\nadasd\n
    1                          sasdad\nasd\ndadaadad\n\n
    2  import pandas as pd\nimport os\n\ndata = []\np...
    

答案 1 :(得分:1)

在阅读@ paul-g的答案后,我决定对它进行一些改动。就上下文而言,我的应用程序用于NLP项目。我的文件具有唯一的标识符,因此使用列表方法并不是我要找的东西,因此我决定使用字典方法。文件名是我的唯一标识符。请注意,如果您的目录中有您要加载的文件以外的其他文件,则可能需要进行其他清理。我的目录中只有我的文本文件。与@ paul-g答案中的ls示例不同,我的python文件位于不同的目录中,因此python文件未包含在我的数据框中。

import pandas as pd
import os

file_names = os.listdir('<folder file path here>')
# Create Dictionary for File Name and Text
file_name_and_text = {}
for file in file_names:
    with open('<folder file path here>' + file, "r") as target_file:
         file_name_and_text[file] = target_file.read()
file_data = (pd.DataFrame.from_dict(file_name_and_text, orient='index')
             .reset_index().rename(index = str, columns = {'index': 'file_name', 0: 'text'}))

这将为您提供如下数据框:

index file_name文本

0 file1.txt这是来自文件1的文本

1 file2.txt这是文件2中的文本