2015-11-25 4 views
1

Я пытаюсь глотать файлы txt (весь каталог) в базу данных pandas, так что каждая строка в кадре данных имеет содержимое одного файла.Python читает txt-файлы в dataframe

Текстовые файлы, насколько я могу судить, не разделены, они являются телом сообщений электронной почты. Все файлы, кроме одного, разбиты на несколько строк. Поэтому вместо 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

Как насчет белого пространства «\ s + "как аргумент разделителя? – multigoodverse

ответ

4

Вы читаете письма как CSV-файлы, так что содержимое файла будет:

  1. Split на каждую вкладку сепараторе, чтобы создать столбец; какой бы разделитель вы ни выбрали, я подозреваю, что это будет плохой выбор, поскольку любой персонаж, вероятно, появится в теле вашей электронной почты;

  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... 
+0

Да, вы правы со своей первой оценкой. Спасибо за помощь, это отлично работает. Я сделал небольшую манипуляцию: 'path = '// каталог-путь' data = [] для f в [f для f в os.listdir (путь), если нет f.startswith ('.')]: print (f) с открытым (путь + f, "r") в качестве файла myfile: data.append (myfile.read(). replace ('\ n', '')) df = pd.DataFrame (data) print (df) ' – OAK

+0

Извините за форматирование кода. Я никогда не могу получить способ форматирования комментариев. – OAK

+0

Рад, что это помогло. Сначала я удалил символы новой строки, но я полагаю, что это специфично для приложения. Иногда вы можете захотеть сохранить их (например, что, если позже вы захотите узнать среднюю длину линии электронной почты). Также я думаю, что вы можете заменить их на '' '', а не '' '', так как теперь вы объединили последнее слово в каждой строке с первым словом на следующей строке, что не кажется хорошей идеей. Если бы это помогло, можете ли вы также принять ответ, пожалуйста? –

Смежные вопросы