我正在尝试将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"]))
我已经将分隔符设置为表格,因为我认为它根本不会影响文本的摄取。 任何想法问题在这里?
答案 0 :(得分:4)
您正在将电子邮件作为CSV文件阅读,因此文件内容将为:
在每个标签分隔符处拆分以创建列;无论你选择哪个分隔符,我都怀疑这将是一个糟糕的选择,因为任何角色都可能出现在你的电子邮件正文中;
电子邮件中的每个换行符都会创建一个新行(可能会解释您的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)
以下是 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中的文本