IN5. Working with Files

更新於 發佈於 閱讀時間約 5 分鐘

題目:https://rosalind.info/problems/ini5/


讀入一個充滿文字的檔案

按照1-based 索引取出偶數行(第2、4、6... 行)

with open("IN5.txt", "r", encoding="utf-8") as file:
lines = file.readlines()for i, line in enumerate(lines, start=1): # 索引從1(第一行)開始,以符合直覺
if i % 2 == 0:
print(line.strip())

僅印出偶數行的文字即可




---


這邊首先複習一下Python讀檔操作的幾種姿勢:

創建一個example.txt

Hello
World
Python


:一次讀全部,讀進來變成大字串。適合小型文件

with open("IN5.txt", "r", encoding="utf-8") as file:
content = file.read() # 一次讀全部

print(content)

# Hello
# World
# Python​

2:一次讀全部,讀近來變成列表。適合小型文件

2-1:去除換行符號

with open("example.txt", "r", encoding="utf-8") as file:
lines = file.readlines() # 讀取所有行,回傳 list

for line in lines:
print(line.strip()) # strip() 移除換行符號

# Hello
# World
# Python

2-2:不去除換行符號

with open("example.txt", "r", encoding="utf-8") as file:
lines = file.readlines() # 讀取所有行,回傳 list

for line in lines:
print(line)

# Hello

# World

# Python

為何會多一個換行?因為print()函式在行尾會自動加上換行字元

所以2-1是把文件原本的\n去除掉,就只會印出一行換行

2-3:印出原始字符

with open("example.txt", "r", encoding="utf-8") as file:
lines = file.readlines() # 讀取所有行,回傳 list

for line in lines:
print(repr(line)) # 讀取格式字符

# 'Hello\n'
# 'World\n'
# 'Python'

這樣就可以看出,2-1是把文件的\n去除掉了,而非去除print()函式的\n

3:一次只讀一行。可讀大型文件

使用迴圈逐行讀取

with open("example.txt", "r", encoding="utf-8") as file:
for line in file:
print(line.strip()) # 每次讀取一行

# Hello
# World
# Python​

4:讀取固定長度字節

with open("example.txt", "r", encoding="utf-8") as file:
chunk = file.read(1024) # 每次讀取 1024 字節
while chunk:
print(chunk)
chunk = file.read(1024)

# Hello
# World
# Python​

5:與1.相同,但更簡潔(pathlib.Path)

from pathlib import Path
content = Path("example.txt").read_text(encoding="utf-8") # 一次讀一整個檔案
# .read_bytes() # 則是讀二進制檔案

print(content)

# Hello
# World
# Python

寫法更短,甚至不用寫open()、也不用with,因為都包好了。是更Pythonic的方式

6:沒有with,則需要手動關閉文件(不推薦)

file = open("IN5.txt", "r", encoding="utf-8")
try:
content = file.read()finally:
file.close() # 手動關閉文件流,確保資源釋放

print(content)
# 只有 def, class 區塊會創建新的作用域(scope)
# if, for, while, with, try/catch 區塊不會創建作用域,所以content變數仍存在

忘記關閉的話會導致記憶體洩漏

avatar-img
0會員
7內容數
這裡存放著 我在Rosalind生物資訊平台的解題過程。 歐印生科ㄌ。
留言
avatar-img
留言分享你的想法!
生物資訊實驗室 的其他內容
計算所有在a~b之間的奇數數字 python沒有內建 isOdd()函式,所以只能寫ifㄍ判斷奇數、偶數 a, b = 100, 200 s = 0 for i in range(a, b+1): if i % 2 == 1: s += i print(s)
題目:https://rosalind.info/problems/ini3/ 給一長字串,然後a, b, c, d 4個數字 切出字串[a~b]、字串[c~d]的位置,連接後印出來 (須包含字串[b]、字串[d]的位置) s = "HumptyDumptysatonawallHum
題目:https://rosalind.info/problems/ini2/ 給直角三角形的兩個邊a, b,求斜邊(hypotenuse)的平方(square) ex: 3, 5 => 9+25 = 34 (不是求斜邊長噢,是"斜邊平方") 直接將 a^2+b^2 計算結果印出
生物資訊界的解題平台,類似於Leetcode 平台規則: 下載dataset之後,五分鐘內要交卷,否則會失敗 與常見解題平台不同,此處是提交dataset的對應答案,而並非提交程式碼 (推測是rosalind沒有可以執行上傳程式的功能) 當時間超時或者答題失敗後,可以再次重來 不
https://rosalind.info/problems/ini1/ 首先從Python Village開始解題起。 安裝好Python、進入Python之後 import this 便會出現一首Python之禪的詩,這是Python的哲學 The Zen of Python,
計算所有在a~b之間的奇數數字 python沒有內建 isOdd()函式,所以只能寫ifㄍ判斷奇數、偶數 a, b = 100, 200 s = 0 for i in range(a, b+1): if i % 2 == 1: s += i print(s)
題目:https://rosalind.info/problems/ini3/ 給一長字串,然後a, b, c, d 4個數字 切出字串[a~b]、字串[c~d]的位置,連接後印出來 (須包含字串[b]、字串[d]的位置) s = "HumptyDumptysatonawallHum
題目:https://rosalind.info/problems/ini2/ 給直角三角形的兩個邊a, b,求斜邊(hypotenuse)的平方(square) ex: 3, 5 => 9+25 = 34 (不是求斜邊長噢,是"斜邊平方") 直接將 a^2+b^2 計算結果印出
生物資訊界的解題平台,類似於Leetcode 平台規則: 下載dataset之後,五分鐘內要交卷,否則會失敗 與常見解題平台不同,此處是提交dataset的對應答案,而並非提交程式碼 (推測是rosalind沒有可以執行上傳程式的功能) 當時間超時或者答題失敗後,可以再次重來 不
https://rosalind.info/problems/ini1/ 首先從Python Village開始解題起。 安裝好Python、進入Python之後 import this 便會出現一首Python之禪的詩,這是Python的哲學 The Zen of Python,
你可能也想看
Google News 追蹤
Thumbnail
本文介紹了在進行資料分析時,將類別欄位轉換為數值欄位的方法,包括Label Encoding、One-Hot Encoding、Binary Encoding、Target Encoding和Frequency Encoding。每種方法的應用範例、優缺點和適用場景都有詳細說明。
Thumbnail
手寫版,有寫錯或看不懂的地方,都可以在底下留言給我。 感謝!
Thumbnail
編輯的基本功,是對文字的敏感度。
Thumbnail
本文介紹了在進行資料分析時,將類別欄位轉換為數值欄位的方法,包括Label Encoding、One-Hot Encoding、Binary Encoding、Target Encoding和Frequency Encoding。每種方法的應用範例、優缺點和適用場景都有詳細說明。
Thumbnail
手寫版,有寫錯或看不懂的地方,都可以在底下留言給我。 感謝!
Thumbnail
編輯的基本功,是對文字的敏感度。