簡體   English   中英

Python將txt文件讀入數據幀

[英]Python read txt files into a dataframe

我試圖將 txt 文件(整個目錄)攝取到 Pandas 數據框中,以便數據框中的每一行都包含一個文件的內容。

據我所知,文本文件沒有分隔,它們是電子郵件的正文。 除一個文件外的所有文件都分成多行。 因此,我有超過 500 行,而不是 20 行(每個文件一個)。 我無法分辨一個文件與其他文件有何不同。 它們都是純文本的。

我使用的代碼是:

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"]))

我已將分隔符設置為表格,因為我認為它根本不會影響文本的攝取。 任何想法這里的問題是什么?

您正在將電子郵件作為 CSV 文件閱讀,因此文件內容將是:

  1. 在每個制表符分隔符處拆分以創建一列; 無論您選擇什么分隔符,我懷疑這都是一個糟糕的選擇,因為任何字符都可能出現在您的電子郵件正文中;

  2. 電子郵件中的每個換行符都會創建一個新行(這可能解釋了您的 500 行)

由於電子郵件不是 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)

下面是這個動作,因為它是一個例子:

$ 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...

在閱讀了@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'}))

這將為您提供如下數據框:

索引文件名文本

0 file1.txt 這是來自文件 1 的文本

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

編輯:如果您有很多小文本文件,可以將其調整為使用 Python 多線程功能 (ThreadPool) 來加​​快加載時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM