簡體   English   中英

從文本文件讀取

[英]Reading from a text file

我不是在這里尋找答案,而是在尋找應該如何完成此任務的指南。

我有一個txt文件,其中包含以下信息:

...
    1947q2        -0.6
    1947q3        -0.3
    1947q4         6.2
    1948q1         6.5
    1948q2         7.6
    1948q3         2.2
    1948q4         0.6
...

我的目標是能夠根據關鍵字選擇來讀取文本文件。 例如,我想讀取僅包含1947的行,因此輸出如下:

    1947q2        -0.6
    1947q3        -0.3
    1947q4         6.2

因為數字與每年相關,所以我想將每一行放入一個元組,然后將所有元組合並到一個列表中。 在此列表中,使用正則表達式搜索列表以獲取匹配的元組並相應地將其打印出來。

這是可以接受的方式嗎? 是否有一個更簡單,更明顯的解決方案? 不是真正地尋找最佳方法,而是關於如何解決這個問題的不同想法。

import sys
with open('file.txt') as f:
  for line in f:
    if '1947' in line: # or some complex regular expressions test
      sys.stdout.write(line)

您可以只解析for循環主體中的每一行,然后決定是否接受它。 如果想花哨的話,請查看mapfilter with語句可確保此后關閉文件。

您可以做的一件事是使用生成器使用與已經完成的類似的方法動態地過濾出列表的成員:

data = open("file.txt")
fortysevens = (line for line in data if contains_47(line))
for line in fortysevens:
    # do something here

def contains_47(line):
    # your existing code here to detect if a line contains 47

您的關鍵字是否總是年份? 如果是這樣,我會將它們存儲在這樣的字典中:

mydata[year][quarter] = value

因此,您可以通過mydata ['1947']來獲取示例數據。

要讀取文件,您可能要使用csv.reader,然后在'q'上拆分第一列以分別獲取年份和季度。

我會編寫代碼,使函數中的所有行都返回一個元組序列,如(1947,3,-7.0)。 然后,對結果進行簡單的迭代即可找出我真正想要的。

如果輸入文件各行中的數據是固定的(看起來像是固定的),則可以執行以下操作:

with open('data.txt') as data:
    for line in data:
        if line[4:8] == '1947':
            print line,

# output:
#     1947q2        -0.6
#     1947q3        -0.3
#     1947q4         6.2

請注意,我之所以使用print line,是因為每個行字符串都以換行符結尾。

據我所知,正則表達式就是為這種工作而發明的。

正則表達式將直接搜索“包含關鍵字的行”。 與使用笨拙的“ for f in line”循環相比,regex的搜索還可以基於更復雜的條件,這些條件將以更簡潔的代碼表示。

我的座右銘是:文本文件中沒有行。 這只是一個字符序列。

“ for f中的行”循環的作用是分析數據流以檢測換行並停止在換行處:這是第一次檢測。 然后,在找到的每條線上,必須在檢測到的每條線上測試一個(或多個)簡單(或復雜)條件:這是第二項研究。

另一方面,正則表達式可直接查找要搜索的內容,而無需預先搜索換行符。 一行的條件和該行中關鍵字的條件要同時測試。

import re

keyw = '1947'
pat = re.compile('.*?' + keyw + '.*')

with open('thefile.txt','r') as f:
    keyworded_lines = pat.findall(f.read())

# do what you need with keyworded_lines

請注意,在“ r”模式下,Python會轉換“ \\ n”中的所有換行符。 由於RE中的點與'\\ n'不匹配,因此RE僅在keyw之后需要'。*'。

暫無
暫無

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

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