Python Script to Combine Rtf Files in a Folder to Csv with Filename as a Separate Column
I've Tried a Plethora of Solutions Which Don't Work. I've Figured out How to Get the Converted Data into a Csv Column, but All Text Is in 1 Cell and I Haven't...
I've tried a plethora of solutions which don't work. I've figured out how to get the converted data into a csv column, but all text is in 1 cell and I haven't figured out how to get the FileNames added as a column.
import pandas as pd
import os
from striprtf.striprtf import rtf_to_text
dir_path = 'C:\\Users\\mairi\\Desktop\\testing txt to excel\\'
def getFiles():
list = []
FileNames = []
for path in os.listdir(dir_path):
if os.path.isfile(os.path.join(dir_path,path)):
with open (os.path.join(dir_path,path)) as file:
text = file.read()
rtfText = rtf_to_text(text,encoding='utf-8')
for text in rtfText:
list.append(rtfText)
FileNames.append(os.path.basename(rtfText))
return list
return FileNames
list = getFiles()
FileNames = getFiles()
Data = pd.DataFrame(columns: 'list','FileNames')
NewPath = 'C:\\Users\\mairi\\Desktop\\testing txt to excel\\NEW\\'
Data.to_csv(os.path.join(NewPath,r'Data.csv'), index = False, header = False)
I've tried for a few days to scrape Stackoverflow and find a solution and now I seem to be getting duplicate file data in each row ?
I think my main issues are. Possible that I need to create an empty dataframe before the function, but I haven't got it working yet.
- separating the text so each new line is a new cell
- Distinct file content so there aren't duplicate rows
- adding the FileNames.
Hopefully, the outcome looks like this...
| Filename | Data |
|---|---|
| Filename_1 | Data line 1 |
| Filename_1 | Data line 2 |
| Filename_2 | Data line 1 |
| Filename_2 | Data line 2 |
| Filename_2 | Data line 3 |
Thank you for any help :)
1 Answer
A friend helped me solve this pickle :)
I was converting and saving all text in the document instead of stripping it line by line.
import pandas as pd
import os
from striprtf.striprtf import rtf_to_text
# Data structure
class fileLine:
def __init__(self, fileName, textLine):
self.fileName = fileName
self.textLine = textLine
# Data files directories
data_dir_path = 'C:\\Users\\mairi\\Desktop\\testing txt to excel\\'
output_dir_path = 'C:\\Users\\mairi\\Desktop\\testing txt to excel\\NEW\\'
# Get all lines of all RTF files in a giver directory
def getRTFLines():
list = []
# For each file in the given directory
for filename in os.listdir(data_dir_path):
filePath = os.path.join(data_dir_path, filename)
# Check if it's an RTF file
if os.path.isfile(filePath) and filePath.endswith('.rtf'):
# Open the RTF file
with open(filePath, encoding='utf-8', errors='ignore') as file:
# Read all the RTF file's content
text = file.read()
# Decode the RTF file's content
rtfText = rtf_to_text(text, encoding='utf-8')
# For each line in the RTF file
for line in rtfText.splitlines():
# Check if it's an empty line
if line:
# Insert the line in our data structure
list.append(fileLine(filename, line))
return list
# Read data
list = getRTFLines()
# Convert data to csv file
data = [[x.fileName, x.textLine] for x in list]
df = pd.DataFrame(data, columns=['File Name', 'Text Line'])
df.to_csv(os.path.join(output_dir_path,r'rtfData-3.csv'), escapechar="")