簡體   English   中英

Python:如何將長文本文件讀入扁平 CSV 格式

[英]Python: How to read a long text file into flattened CSV format

我正在嘗試將我的日記從 word (txt) 轉移到我打算使用的新應用程序中。 該應用程序接受 csv 文件作為源,盡管到目前為止我的日記條目如下所示。 新期刊在下面,中間有一個換行符。

21.08.2022
期刊 1234
文字和越來越多的文字
還有一些文字
最后結束
期刊結束

這種格式非常嚴格,前兩行總是相同的格式,最后一行完全相同,中間的東西可能都在一行或多行。 我很有信心它總是這樣。 只要我可以將不同的期刊分開到 csv 中的不同行,我知道我可以在 Excel 中提取日期和期刊號,但我正在努力分離期刊。

Excel 不允許使用長分隔符,並且在谷歌搜索時我找到了使用 pandas 的解決方案,盡管問題似乎相同。 我嘗試了以下。

read_file = pd.read_csv (r'C:\Users\admin\Downloads\journal testing to csv small.txt',delimiter='Journal end')
read_file.to_csv (r'C:\Users\admin\Downloads\journal testing csv.csv', index=None)

沒有 go,我理解,因為我正在嘗試使用長分隔符並且代碼並沒有真正習慣於做我希望的事情。 我不能手動進行這種分離,因為我在日記中有大約 1,5k 條目。 有誰知道我怎樣才能有效地做到這一點?

提前謝謝了。 如果我能在不花費大量時間做非常手動的事情的情況下組織它,那將是不可思議的。

日志.txt文件可以在“entry-chunks”中讀取,每個條目依次寫入 output CSV 文件。 “分塊”由下面的readjournal()生成器處理。

有誰知道我怎樣才能有效地做到這一點?

這種方法是有效的,因為一次只將一個條目讀入 memory,而不是將整個日志(1500 多個條目)讀入 memory。

例如:

def readjournal(path: str) -> str:
    """Read journal entries.
    
    Args:
        path (str): Full path to journal text file.
        
    Yields:
        str: A comma separated string of lines for a single entry. 
    
    """
    entry = []
    with open(path, 'r') as f:
        for line in f:
            line = line.strip()
            if line:
                entry.append(line)
            else: 
                yield ','.join(entry)
                entry = []

# Write flattened journal entries to CSV.
with open('./journal.csv', 'a') as f:
    for entry in readjournal('./journal.txt'):
        f.write(entry + '\n') 

Output:

# Windows:
> type journal.csv

# *nix:
$ cat journal.csv

15.08.2022,Journal 1015,Line 1 from journal 1015,Line 2 from journal 1015,Line 3 from journal 1015,Journal end
16.08.2022,Journal 1016,Line 1 from journal 1016,Line 2 from journal 1016,Line 3 from journal 1016,Journal end
17.08.2022,Journal 1017,Line 1 from journal 1017,Line 2 from journal 1017,Line 3 from journal 1017,Journal end
18.08.2022,Journal 1018,Line 1 from journal 1018,Line 2 from journal 1018,Line 3 from journal 1018,Journal end

源文本文件:

為了完整起見,我包含了用於測試的源文本文件的一部分:

15.08.2022
Journal 1015
Line 1 from journal 1015
Line 2 from journal 1015
Line 3 from journal 1015
Journal end
 
...   
 
19.08.2022
Journal 1019
Line 1 from journal 1019
Line 2 from journal 1019
Line 3 from journal 1019
Journal end

我建議不要使用 Pandas 來讀取文件。 這將比它的價值更麻煩。 相反,我會為此使用 Python 的字符串操作。

因此,您可以像這樣打開文件,並通過連續兩個換行符拆分日記帳分錄:

with open("journal.txt", "rt") as f:
    entries = f.read().split("\n\n")

這將為您提供一個列表,其中每個元素都作為日記帳分錄。 (我將“中間有一個換行符”解釋為您將每個日記條目用空行分隔。如果這是錯誤的,您需要將"\n\n"更改為"Journal end"或類似的東西.)

接下來,您可以將每個日記帳分錄分成組件日期和標題。

entry_records = []
for entry in entries:
    lines = entry.split("\n")
    date = lines[0]
    title = lines[1]
    body = lines[2:-1]  # Ignore first two lines, and last line.
    body = "\n".join(body)  # Join list of strings into single string.
    entry_records.append({
        "date": date,
        "title": title,
        "body": body,
    })

現在您有一個字典列表,其中每個字典都有日期、標題和正文。 在此示例中,它完全依賴條目中的 position 來確定日期和標題是什么。 你可以做一些比這更復雜的事情,但我不確定它是否值得。

Pandas 可以像這樣導入字典列表:

import pandas as pd
df = pd.DataFrame(entry_records)

然后您可以根據需要保存 dataframe。

暫無
暫無

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

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