Python 讀寫檔案

本篇 ShengYu 要介紹如何使用 python 來讀寫檔案,內容包含開檔、讀檔、寫檔與關檔,這些 python 常用的檔案操作,是 python 基本入門必學的技能,趕快來學習如何用python 讀寫文字檔吧!

本篇內容將分為以下幾部份:

  • 讀檔範例. 一次讀取全部的文字
  • 讀檔範例. 一次讀取一行
  • 寫檔範例. 覆寫模式
  • 寫檔範例. 添加模式

馬上開始吧!

讀檔範例. 一次讀取全部的文字

本範例示範用 python 從 input.txt 檔案讀取資料,input.txt 內容如下:

input.txt
1
2
3
111/1.txt
222/2.txt
333/3.txt

一開始要 open() 開檔,再來使用 read() 把所有文字讀進來,接著印出來。

readFile.py
1
2
3
4
5
6
7
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# 一次讀全部
f = open('input.txt')
print(f.read())
f.close

輸出:

1
2
3
111/1.txt
222/2.txt
333/3.txt

讀檔範例. 一次讀取一行

也是先 open() 開檔,再來每次迴圈使用 readlines() 來讀取一行文字,並且印出來,最後再關檔。

readFile2.py
1
2
3
4
5
6
7
8
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# 一次讀一行
f = open('input.txt')
for line in f.readlines():
print(line)
f.close

輸出:

1
2
3
4
5
111/1.txt

222/2.txt

333/3.txt

寫檔範例. 覆寫模式

本範例示範用 python 把文字寫到 output.txt 檔案裡。

一開始是 open() 開檔並且是寫入覆寫模式,之後用 write() 將文字寫入檔案,\n表示換行,最後再 close() 關檔。

writeFile.py
1
2
3
4
5
6
7
8
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

print('開檔,並覆寫')
f = open('output.txt', 'w')
f.write('123')
f.write('456\n')
f.close

輸出的 output.txt:

output.txt
1
123456

寫檔範例. 添加模式

一開始是 open() 開檔並且是寫入添加模式,寫入的文字會接在上次檔尾。之後用 write() 將文字寫入檔案,使用 seek()可以移動讀取指針,在呼叫read()可以讀出該位置的文字,最後再 close() 關檔。

writeFile2.py
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

f = open('output.txt', 'a+')
f.write('123')
f.write('456\n')

f.seek(5)
print(f.read(1))
f.close

輸出的 output.txt:

output.txt
1
2
123456
123456

console 輸出:

1
6

以上就是使用 python 來讀寫檔案的介紹。

其它相關文章推薦
Python 讀取 txt 文字檔
Python 寫檔,寫入 txt 文字檔
Python 讓程式 sleep 延遲暫停時間
Python 第一支 Python 程式

Git 顯示某個檔案的歷史修改記錄

有時候會需要查看某個檔案的 git 歷史修改記錄,誰修改了這個檔案以及檔案內容修改了什麼,在那一個 commit 裡其他檔案又修改了什麼,本篇介紹如何使用 git 來查看檔案歷史記錄,另外使用圖形化介面 gitk 也可以做到,而且效率更快。

顯示某個檔案的歷史修改記錄 (commit節點)

這個只會顯示該檔案被修改的 commit 節點,還不會顯示修改的內容。

1
git log <filename>

顯示某個檔案的歷史修改記錄 (列出修改內容)

跟上面指令一樣,只是文字輸出,
不要覺得這個沒用途唷!有時候想要在歷史修改搜尋某個字串,就會需要搭配這個指令。

1
git log -p <filename>

之後會列出綠色字為新增部份,紅色字為刪除部份,用/可以輸入關鍵字來搜尋

使用圖形化介面來顯示某個檔案的歷史修改記錄 (推薦使用!快又方便!)

gitk 這個工具查看某個檔案的修改歷史修改紀錄可以快速地點一個 commit 節點,同時也會顯示出這 commit 節點這個檔案的修改內容。

1
gitk <filename>

其他參考
git log - View the change history of a file using Git versioning - Stack Overflow
https://stackoverflow.com/questions/278192/view-the-change-history-of-a-file-using-git-versioning
timeline - How to view file history in Git? - Stack Overflow
https://stackoverflow.com/questions/1786027/how-to-view-file-history-in-git/1786184

其它相關文章推薦
Github 如何更新已經 fork 的專案與原專案紀錄同步
Git 常用指令
Git 修改上次的 commit
Git commit 檔案的某幾個小部分修改

Mac OS 安裝 Hexo

本篇紀錄在 Mac OS 下安裝 Hexo 的過程與步驟,

安裝環境

以下為我的安裝環境:

  • Mac OS 10.13.4
  • node v10.10.0 (node -v 指令查看)
  • npm v6.4.1 (npm -v 指令查看)

安裝步驟

安裝步驟只需要兩步驟,

步驟1. 安裝nodejs

1
brew install node

步驟2. 安裝hexo

1
sudo npm install -g hexo

之後步驟參考 Hexo Ubuntu 安裝篇

相關文章
Hexo 使用 Google Analytics 進行網站流量分析
Hexo 本機測試時如何關閉 Google Analytics
Hexo codeblock 插入程式碼區塊與各種程式語言預覽
升級更新 Hexo upgrade
Hexo 熱門主題列表
Ubuntu 安裝 Hexo

macOS Screen Sharing 用指令開啟螢幕分享

本篇 ShengYu 介紹 macOS 如何用指令開啟螢幕分享 Screen Sharing,在圖形介面中要開啟螢幕分享功能的話是從 系統偏好設定 > 共享 > 螢幕共享 的選項去勾選開啟,但有時候從遠端 SSH 登入時突然想用遠端視窗登入,就無法用圖形介面去開啟螢幕分享功能,而此時螢幕分享如果是關閉的話,就會需要用到指令來開啟了。

macOS 螢幕分享的 port 為 5900,以下就來介紹怎麼開啟與關閉的指令吧!

開始螢幕分享 Start Screen Sharing

輸入以下指令開始螢幕分享,

1
2
sudo defaults write /var/db/launchd.db/com.apple.launchd/overrides.plist com.apple.screensharing -dict Disabled -bool false
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.screensharing.plist

停止螢幕分享 Stop Screen Sharing

輸入以下指令停止螢幕分享,

1
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.screensharing.plist

其它相關文章推薦
Ubuntu 安裝 VNC Server

Ubuntu 安裝 x11vnc VNC Server

本篇 ShengYu 紀錄在 Ubuntu 16.04 / Ubuntu 18.04 下安裝 x11vnc VNC Server,
以下為 Ubuntu 安裝 VNC server 的內容,大概分為這幾部份,

  • Ubuntu 安裝 x11vnc VNC Server
  • 設定 VNC 密碼
  • 手動啟動 x11vnc server
  • x11vnc 參數說明
  • 自動啟動 x11vnc server (開機自動啟動)
  • 確認 x11vnc server 狀態
  • Ubuntu VNC 客戶端程式
  • Windows VNC 客戶端程式
  • macOS VNC 客戶端程式
  • SSH 通訊埠轉發

Ubuntu 安裝 x11vnc VNC Server

使用 apt 指令來安裝 x11vnc server

1
sudo apt-get install x11vnc

設定 VNC 密碼

設定 x11vnc 的連線密碼,使用 x11vnc -storepasswd 指令來設定之後未來 vnc 的連線密碼,並指定要將密碼存放在 /etc/x11vnc.pass 路徑下,

1
2
3
4
5
$ sudo x11vnc -storepasswd /etc/x11vnc.pass
Enter VNC password:
Verify password:
Write password to /etc/x11vnc.pass? [y]/n y
Password written to: /etc/x11vnc.pass

手動啟動 x11vnc server

手動啟動 x11vnc server,Ubuntu 16.04 可以使用下列指令,

1
2
3
4
5
6
7
8
sudo x11vnc \
-display :0 \
-auth /var/run/lightdm/root/:0 \
-forever -bg \
-noxdamage -noxrecord -noxfixes \
-rfbauth /etc/x11vnc.pass \
-rfbport 5900 \
-o /var/log/x11vnc.log

Ubuntu 18.04 可以使用下列指令,跟上面 Ubuntu 16.04 的差別在 -auth 參數,

1
2
3
4
5
6
7
8
sudo x11vnc \
-display :0 \
-auth /run/user/1000/gdm/Xauthority \
-forever -bg \
-noxdamage -noxrecord -noxfixes \
-rfbauth /etc/x11vnc.pass \
-rfbport 5900 \
-o /var/log/x11vnc.log

因為使用 -bg 參數會放到背景執行,所以要關閉 x11vnc server 可以使用 kill / killall 指令,

1
sudo killall x11vnc

或者 x11vnc 來關閉 x11vnc server

1
x11vnc -R stop

x11vnc 參數說明

以下為常用的一些 x11vnc 參數與說明,
-display :0:顯示和本地端的 DISPLAY :0, 即客戶端看到的畫面和本地端看的畫面一樣
-usepw:使用密碼
-nopw:不使用密碼
-rfbauth:指定之前設定好的 vnc 連線密碼檔
-bg:背景執行
-forever:繼續監聽更多 vnc 連線,沒有這個參數的話會在第一個客戶端離線後,就退出程式
-rfbport:指定 vnc 的連接埠
-o:輸出日誌
-auth guess 讓 vnc 自行猜測進行連線
-auth /var/lib/gdm/:0.Xauth 使用 GDM 的 X-Session 進行連線
-auth /var/run/lightdm/root/:0 使用 lightdm 的 X-Session 進行連線
-viewonly:所有客戶端只能看,沒有控制權,即不能控制滑鼠與鍵盤(預設關閉)
-shared:VNC display is shared, i.e. more than one viewer can
connect at the same time (default off).
-geometry WxH:顯示的大小,例如:-geometry 1024x768

自動啟動 x11vnc server (開機自動啟動)

Ubuntu 要開機自動啟動 x11vnc server 的話,就要寫一個 service 的設定檔,方法如下,
編輯 x11vnc.service,內容如下,這份設定適用於 Ubuntu 16.04,
Ubuntu 18.04 就把 -auth 改成 /run/user/1000/gdm/Xauthority 即可,
ExecStop 這行可有可無,

x11vnc.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[Unit]
Description=x11vnc
After=multi-user.target

[Service]
Type=simple
ExecStart=/usr/bin/x11vnc \
-display :0 \
-auth /var/run/lightdm/root/:0 \
-forever -loop -noxdamage -repeat \
-rfbauth /etc/x11vnc.pass \
-rfbport 5900 \
-o /var/log/x11vnc.log \
-shared
ExecStop=/usr/bin/x11vnc -R stop

[Install]
WantedBy=multi-user.target

移動 x11vnc.service 到 /etc/systemd/system/ 路徑下,並修改存取權限

1
2
3
sudo mv ~/x11vnc.service /etc/systemd/system/
sudo chmod 644 /etc/systemd/system/x11vnc.service
sudo chown root:root /etc/systemd/system/x11vnc.service

重新載入設定值與啟動 x11vnc server 服務

1
2
3
sudo systemctl daemon-reload
sudo systemctl enable x11vnc.service # 啟用 x11vnc 服務
sudo systemctl start x11vnc.service # 啟動 x11vnc 服務

確認 x11vnc server 狀態

確認 x11vnc server 有在執行

1
$ ps aux | grep x11vnc

確認 x11vnc server 的監聽埠 5900

1
2
3
$ netstat -l | grep 5900
tcp 0 0 *:5900 *:* LISTEN
tcp6 0 0 [::]:5900 [::]:* LISTEN

Ubuntu VNC 客戶端程式

Ubuntu 可以使用內建的 Remmina Remote Desktop Client 來進行 VNC 連線,一些必要的設定與選項如下,

1
2
3
4
5
6
7
Name: xxx
Protocol: VNC-Virtual Network Computing
Server: ip:
User name:
Password: your password
Color depth: High color(16bit)
Quality: Good

若是區域網路內的連線,Color depth 可以選到最高 True color(24bit)

Windows VNC 客戶端程式

在 Windows 可以選用 REAL VNC 這款免費的 VNC Viewer,

macOS VNC 客戶端程式

macOS 內建有 VNC 客戶端程式,要使用 macOS 內建的 VNC 客戶端程式的方式法是 Finder > 前往 > 連接伺服器,之後輸入 vnc://<ip>,例如 vnc://192.168.1.5 再按連線即可。

SSH 通訊埠轉發

要安全地使用 x11vnc 的話,可以搭配 ssh 來達成安全性,
概念是將 x11vnc 改成綁定本機端 loopback 網路介面,這樣外部的連線就無法連上,

x11vnc 要綁定本機端 loopback 網路介面的方法是加上 -localhost 的參數,

1
x11vnc -localhost ... -rfbport 5900 ...

客戶端要使用 VNC 前,先用 ssh 通訊埠轉發,同時要確定客戶端沒有 5900 的服務正在開啟中,例如客戶端也有一個 VNC Server 的服務剛好也是使用 5900 的話就需要先關閉或改用其他 port,以下 ssh 指令使用後會登入遠端電腦並轉發這些通訊埠,一旦 ssh 連線終止轉發通訊埠也會終止,所以 ssh 登入後就保持連線直到使用完畢再終止連線即可,

1
ssh <x11vnc-server-host> -L 5900:localhsot:5900

然後客戶端再用 VNC 連接自己本機端的 port 5900 vnc://localhost:5900 即可。
如果 VNC 嘗試連線失敗時 ssh terminal 出現 channel 3: open failed: administratively prohibited: open failed 的錯誤訊息的話,可將 localhsot 改用 127.0.0.1 試試。

1
ssh <x11vnc-server-host> -L 5900:127.0.0.1:5900

其它參考
x11vnc(1) - Linux man page
https://linux.die.net/man/1/x11vnc
Bahut: VNC server for Cinnamon with systemd
http://bahut.alma.ch/2018/10/vnc-server-for-cinnamon-with-systemd.html

其它相關文章推薦
macOS Screen Sharing 用指令開啟螢幕分享

在 Ubuntu 下安裝 Anaconda

以下介紹如何使用 Ubuntu 16.04 安裝 Anaconda 環境

下載與安裝 Anaconda

歷史安裝包可以到 Anaconda installer archive下載,
目前最新版是︰
Anaconda2-2019.03-Linux-x86_64.sh
Anaconda3-2019.03-Linux-x86_64.sh

  • python2 請下載 anaconda2, python3 請下載 anaconda3
  • python2/anaconda2 才能跑 pyqt4, python3/anaconda3 才能跑 pyqt5
  • pyqt4 需下載2016年7月或更早的版本
1
bash Anaconda-latest-Linux-x86_64.sh

加入 PATH 設定

假設你把 anaconda 裝在 /opt/anaconda3 下,
可以使用下列指令設定 PATH 系統環境變數,
或者在 .bashrc 加入,每次使用 bash 便會自動設定,
第一次加入 .bashrc 完需 source ~/.bashrc 即可立即生效。

1
export PATH="/opt/anaconda3/bin:$PATH"

確認 Anaconda 安裝完成

可以使用 python --version 來確認 python 版本

參考
https://blog.csdn.net/huangjuegeek/article/details/73556763

相關主題
Python 第一支 Python 程式

Python 在 Ubuntu 下使用 Pycharm IDE 教學

本篇教學介紹如何在 Ubuntu 下安裝使用 pycharm,本篇 pycharm 教學會逐步從 apt 下載安裝開始到安裝完畢,最後是設定 anaconda 的 interpreter。

下載安裝 pycharm

1
2
$ sudo add-apt-repository ppa:mystic-mirage/pycharm
$ sudo apt update

安裝社群版 Install the community version

1
$ sudo apt install pycharm-community

安裝專業版 Install the Professional version

1
$ sudo apt install pycharm

在 pycharm 中設定 anaconda 的 interpreter

選擇 File->Default settings->Default project->project interpreter

點擊 project interpreter 的右邊的小齒輪,選擇 add local ,選擇anaconda文件路徑下的python.exe。接著pycharm會更新解釋器,導入模塊等,要稍等一點時間。

到目前為止,anaconda在pycharm中的配置就基本完成了。

如果要在已產生的專案切換 interpreter 的話則是
選擇 File->Settings->Project->Project Interpreter 進行切換

參考 Refernece
http://ubuntuhandbook.org/index.php/2016/07/latest-pycharm-ubuntu-16-04-ppa/

相關主題
Python 第一支 Python 程式

安裝 Qt 在 Windows 7 (使用MSVC)

本篇將會介紹一下如何在 Windows 下安裝 Qt 開發環境。

系統環境

以下為我的系統環境:

  • Windows 7
  • Qt5.10.0 (qt-opensource-windows-x86-5.10.0.exe)

安裝 Qt

先從官網下載 Qt, 目前最新為5.10,
可以依照你要開發的程式選擇對應的預編譯的函式庫

安裝好之後,

假如要寫32-bit的程式, 安裝時選擇 MSVC 2015 32-bit 預先編譯的QT函式庫,
把 Qt 32-bit DLL 路徑加進系統環境變數裡

1
C:\Qt\Qt5.10.0\5.10.0\msvc2015\bin

假如要寫64-bit的程式, 安裝時選擇 MSVC 2015 64-bit 預先編譯的QT函式庫,
把 Qt 64-bit DLL 路徑加進系統環境變數裡

1
C:\Qt\Qt5.10.0\5.10.0\msvc2015_64\bin

其它相關文章推薦
[Qt] 讀檔,讀取 txt 文字檔
[Qt] 寫檔,寫入 txt 文字檔
Qt產生的exe發布方式
Qt 新增多國語言.ts翻譯檔案
Qt5的中文亂碼問題如何解決

Ubuntu 安裝 WinUSB(WoeUSB)

Winusb(WoeUSB) 是一個在 Ubuntu 下把 Windows ISO/DVD 製作成 USB 安裝碟的工具,本篇要介紹如何在 Ubuntu 下編譯安裝 Winusb。

本篇使用 Ubuntu 16.04 安裝 Winusb

以下方法都要裝這個相依套件

1
sudo apt-get install libwxgtk3.0-dev

方法一,編譯安裝 slacka 的 WoeUSB

github: slacka/WoeUSB
編譯

1
2
3
4
5
6
git clone https://github.com/slacka/WoeUSB
cd WoeUSB
autoreconf --force --install # Most non-Debian derived distros will need this
./configure
make
sudo make install

啟動

1
sudo woeusbgui

方法二,編譯安裝 aaptel 的 WoeUSB

github: aaptel/WinUSB
版本1.0.11, 比方法三1.0.11版 多了一些修正

編譯

1
2
3
4
git clone https://github.com/aaptel/WinUSB
./configure
make
sudo make install

啟動

1
sudo woeusbgui

方法三,編譯安裝 debian 管理包的 WoeUSB

參考這篇 How to Install Winusb on Ubuntu 16.04

1
2
3
4
5
6
7
8
9
wget ftp://ftp.ru.debian.org/gentoo-distfiles/distfiles/winusb-1.0.11.tar.gz
tar xvf winusb-1.0.11.tar.gz
cd winusb-1.0.11/src
sed -i -- 's#wxStandardPaths().GetInstallPrefix()#wxStandardPaths::Get().GetInstallPrefix()#g' findFile.cpp
sed -i -- 's#wxStandardPaths().GetDataDir()#wxStandardPaths::Get().GetDataDir()#g' findFile.cpp
cd ..
./configure
make
sudo make install

啟動 同方法二