2022年7月5日 星期二

titanic_0004:文字輸出

titanic_0004 :文字輸出

2022/07/02

說明:

本文示範如何將 Python 的文字輸出 [1] 從螢幕 [2] - [4] 轉向到文字檔 [5] - [9]。

-----

https://pixabay.com/zh/photos/umbrella-only-sad-depression-2603980/

-----

Q1:如何另存 pandas dataframe 的 info() 到指定的文字檔?

A1:參考代碼一。


「1. 首先另存 sys.stdout 備用。

2. 開檔,並將 sys.stdout 指向所開的檔案。

3. 如此原來輸出到 sys.stdout(螢幕)的 info() 便會改成輸出到檔案。

4. 關檔。

5. 將原本備份的 sys.stdout 回存。」[5]。


寫程式前,先確定底下六個事項:

一、df.info()

「DataFrame.info(verbose=None, buf=None, max_cols=None, memory_usage=None, show_counts=None, null_counts=None)」[2]。鐵達尼號的訓練集 train.csv 有重要的資訊,當讀入到 dataframe 後,「buf=None」,「默認情況下,輸出打印到 sys.stdout」[2]。

二、print()

「print(object(s), sep=separator, end=end, file=file, flush=flush)」[3]。df.info() 的預設輸出跟 print() 一樣,都是 sys.stdout [3]。

三、sys.stdout

「sys.stdin、sys.stdout、sys.stderr。」[4]。系統的標準輸入、標準輸出、與標準錯誤輸出,通常是鍵盤、螢幕、螢幕。

四、sys.__stdout__

「sys.__stdin__、sys.__stdout__、sys.__stderr__。」[4]。預設值。

五、備份參考 sys.stdout

「我會嘗試這種解決方法(根本不使用 sys.__stdout__,因為您的環境可能使 sys.stdout、 sys.__stdout__ 兩者都不同 ):」[5]。

六、讀取並印出「t0004_1.txt」

記得關檔 [7]。

-----

代碼一

import pandas as pd
import sys

# read train.csv
f_p = '/content/drive/My Drive/colab/data/titanic/' # file path
df = pd.read_csv(f_p+'train.csv')

# test 1
print('\ntest1')
df.info()

# test 2
print('\ntest2')
df.info()

# test 3
print('\ntest3')
old_stdout = sys.stdout
sys.stdout = open(f_p+'t0004_1.txt', 'w')
# print('hey')
df.info()
sys.stdout.close()
sys.stdout = old_stdout

# test 4
print('\ntest4')
df.info()

# test 5
print('\ntest5')
f = open(f_p+'t0004_1.txt', 'r')
# f.read()
print(f.read())
f.close()

-----


Fig. 1. 「test1」 to 「test4」.

圖一:

可看到 test1 與 test2 的訊息後,緊接的是 info()。而 test3 的訊息後面,info() 的內容並未顯示在螢幕上。test4 之後繼續顯示 info()。

-----


Fig. 2. 「test4」and 「test5」.

圖二:

test4 之後,又可正常顯示 info() 到螢幕。test5 的訊息印出後,如果我們不下「print(f.read())」、「f.close()」,而是使用註解裡的「f.read()」,則可以看到存入 t0004_1.txt 裡的是包含許多換行字元 \n 的長字串。

-----


Fig. 3. 「t0004_1.txt」.

圖三:

用 print() 或者用記事本開啟,t0004_1.txt 的長字串都可正常顯示換行的效果。

-----

References


# df.info()

[1] 鐵達尼號的悲劇:預測船難生還者的特徵工程筆記(搭配 FLAML 自動化建模)以及對 Kaggle 競賽的一些觀察 | by Alan Wang | Medium

https://alankrantas.medium.com/%E9%90%B5%E9%81%94%E5%B0%BC%E8%99%9F%E7%9A%84%E6%82%B2%E5%8A%87-%E9%A0%90%E6%B8%AC%E8%88%B9%E9%9B%A3%E7%94%9F%E9%82%84%E8%80%85%E7%9A%84%E7%89%B9%E5%BE%B5%E5%B7%A5%E7%A8%8B%E7%AD%86%E8%A8%98-%E6%90%AD%E9%85%8D-flaml-%E8%87%AA%E5%8B%95%E5%8C%96%E5%BB%BA%E6%A8%A1-%E4%BB%A5%E5%8F%8A%E5%B0%8D-kaggle-%E7%AB%B6%E8%B3%BD%E7%9A%84%E4%B8%80%E4%BA%9B%E8%A7%80%E5%AF%9F-ca3f4b11af34


# df.info() buf sys.stdout

[2] pandas.DataFrame.info — pandas 1.4.3 documentation

https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.info.html


# file sys.stdout

[3] Python print() Function

https://www.w3schools.com/python/ref_func_print.asp


# sys.stdout __stdout__

[4] sys — System-specific parameters and functions — Python 3.10.5 documentation

https://docs.python.org/3/library/sys.html


# stdout source code

[5] python - sys.stdout not reassigning to sys.__stdout__ - Stack Overflow

https://stackoverflow.com/questions/12719328/sys-stdout-not-reassigning-to-sys-stdout


# open()

[6] Python File Open

https://www.w3schools.com/python/python_file_handling.asp


# read() close()

[7] Python File Open

https://www.w3schools.com/python/python_file_open.asp


# write()

[8] Python File Write

https://www.w3schools.com/python/python_file_write.asp


# os.remove() os.rmdir() os.path.exists()

[9] Python Delete File

https://www.w3schools.com/python/python_file_remove.asp

-----

鐵達尼號 Python 實作(目錄)

https://mandhistory.blogspot.com/2022/06/titanic.html

-----

沒有留言:

張貼留言

注意:只有此網誌的成員可以留言。