成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python 小技巧 | Windows 文件名非用反斜杠

開發 后端
在編程過程中,我們往往會遇到一個小麻煩——微軟 Windows 系統在文件夾名之間使用反斜杠字符,而幾乎所有其它的計算機(操作系統)都使用正斜杠。

 

在編程過程中,我們往往會遇到一個小麻煩——微軟 Windows 系統在文件夾名之間使用反斜杠字符,而幾乎所有其它的計算機(操作系統)都使用正斜杠: 

  1. Windows filenames:  
  2. C:some_foldersome_file.txt  
  3. Most other operating systems:  
  4. /some_folder/some_file.txt 

這是由于上世紀 80 年代早期計算機歷史上的一個小意外。「MS-DOS」的第一版使用了正斜杠字符來指定命令行選項。當微軟在「MS-DOS 2.0」中加入了對文件夾的支持時,正斜杠字符已經被使用了,所以他們采用了反斜杠作為替代。35 年后,我們仍然被受困于這種不一致性。

如果你想讓你的 Python 代碼同時在 Windows 和 Mac/Linux 上工作,你就需要處理這種與平臺相關的問題。幸運的是,Python 3 有一個名為「pathlib」的新模塊,使得用戶處理文件幾乎沒有任何困難。

讓我們快速瀏覽一下處理文件名路徑的不同方法,看看「pathlib」如何能讓你的生活變得更美好!

錯誤的解決方案:手動構建文件路徑

假設你有一個數據文件夾,該文件夾包含你想要在你的 Python 程序中打開的文件:

在 Python 中對其進行編碼是「錯誤」的方式: 

  1. data_folder = "source_data/text_files/"  
  2. file_to_open = data_folder + "raw_data.txt"  
  3. f = open(file_to_open)  
  4. print(f.read()) 

請注意,由于我使用的是 Mac 系統,所以我使用了「Unix」風格的正斜杠對路徑進行了硬編碼。這也會讓 Windows 的用戶感到憤怒。

從技術上講,這段代碼在 Windows 上仍然有效,因為 Python 有一個「黑客」(hack)技術:當你在 Windows 上調用「open()」函數時,它會識別這兩種斜線。但即便如此,你也不應該依賴它。如果你在錯誤的操作系統上使用了錯誤類型的斜杠(尤其是在它們與外部程序或代碼庫交互時),并不是所有的 Python 庫都會正常工作。

Python 對混合斜杠類型的支持是一種只針對 Windows 的「黑客」技術,它反過來并不起作用。在 Mac 系統環境下,在代碼中使用反斜杠會導致徹底失敗: 

  1. data_folder = "source_data\text_files\"  
  2. file_to_open = data_folder + "raw_data.txt"  
  3. f = open(file_to_open)  
  4. print(f.read())  
  5. # On a Mac, this code will throw an exception:  
  6. # FileNotFoundError: [Errno 2] No such file or directory:  source_data\text_files\raw_data.txt 

由于所有這些原因以及其他原因,使用硬編碼的路徑字符串編寫代碼,是一種會讓其他程序員十分「嫌棄」的做法。一般來說,你應該盡量避免這么做。

以前的解決方案:Python 的「os.path」模塊

Python 的「os.path」模塊有很多工具來處理這類針對特定操作系統的文件系統問題。

你可以使用「os.path.join()」為當前的操作系統構建一個使用正確類型斜杠的路徑字符串: 

  1. import os.path  
  2. data_folder = os.path.join("source_data", "text_files")  
  3. file_to_open = os.path.join(data_folder, "raw_data.txt") 
  4. f = open(file_to_open)  
  5. print(f.read()) 

這段代碼可以同時在「Windows」或「Mac」系統上完美運行。問題是它使用起來很麻煩。寫出「os.path.join()」并將路徑的每個部分作為獨立的字符串傳給該函數非常冗長,而且很不直觀。

由于「os.path」模塊中的大多數函數使用起來很煩人,開發者們通常會「忘記」使用它們,即使他們知道這樣做更好。這導致出現了很多跨平臺的 Bug,也引起了用戶的憤怒。

更好的解決方案:Python 3 的「pathlib」!

為了處理文件和路徑,Python 3.4 引入了一個名為「pathlib」的新標準庫,而且非常好用!

要使用該庫,你只需使用正斜杠將一個路徑或文件名傳給一個新的「Path()」對象,然后它將處理余下的操作: 

  1. from pathlib import Path  
  2. data_folder = Path("source_data/text_files/")  
  3. file_to_open = data_folder / "raw_data.txt"  
  4. f = open(file_to_open)  
  5. print(f.read()) 

在這里,有兩點需要注意:

  •  你應該在使用「pathlib」函數的情況下使用正斜杠。「Path()」函數將會把正斜杠轉化為適應當前操作系統環境的正確斜杠。贊!
  •  如果你想要在路徑上進行添加,你可以直接在你的代碼中使用「/」操作符。你再也不用一遍又一遍地輸入「os.path.join(a, b)」了。

如果「pathlib」所做的就這么多,它也已經是對于 Python 的一個很好的補充了。但是,它還能做更多!

例如,我們可以在無需打開和關閉文件的情況下,讀取文本文件的內容: 

  1. from pathlib import Path  
  2. data_folder = Path("source_data/text_files/")  
  3. file_to_open = data_folder / "raw_data.txt"  
  4. print(file_to_open.read_text()) 

專業提示:之前的示例是有 Bug 的,因為打開的文件從來沒有被關閉過。而這里的這種語法則徹底避免了這個 Bug。

事實上,「pathlib」使大多數標準的文件操作變得快速而簡單: 

  1. from pathlib import Path  
  2. filename = Path("source_data/text_files/raw_data.txt")  
  3. print(filename.name)  
  4. # prints "raw_data.txt"  
  5. print(filename.suffix)  
  6. # prints "txt"  
  7. print(filename.stem)  
  8. # prints "raw_data"  
  9. if not filename.exists():  
  10.     print("Oops, file doesn t exist!")  
  11. else:  
  12.     print("Yay, the file exists!") 

你甚至可以使用「pathlib」顯式地將一個「Unix」路徑轉化為一個「Windows」格式的路徑: 

  1. from pathlib import Path, PureWindowsPath  
  2. filename = Path("source_data/text_files/raw_data.txt")  
  3. # Convert path to Windows format  
  4. path_on_windows = PureWindowsPath(filename)  
  5. print(path_on_windows)  
  6. # prints "source_data   ext_files  
  7. aw_data.txt" 

如果你真的想安全地在你的代碼中使用反斜杠,你可以按照「Windows」格式聲明你的路徑,而「pathlib」可以對其進行轉化,使其能在當前的操作系統中工作: 

  1. from pathlib import Path, PureWindowsPath  
  2. # I ve explicitly declared my path as being in Windows format, so I can use forward slashes in it.  
  3. filename = PureWindowsPath("source_data\text_files\raw_data.txt")  
  4. # Convert path to the right format for the current operating system  
  5. correct_path = Path(filename)  
  6. print(correct_path)  
  7. # prints "source_data/text_files/raw_data.txt" on Mac and Linux  
  8. # prints "source_data   ext_files 
  9. aw_data.txt" on Windows 

如果你想把代碼寫得更「高級」一些,你甚至可以使用「pathlib」來做諸如解析相對路徑、解析網絡共享路徑并生成「file:// urls」之類的事。在下面的例子中,我們將僅僅使用兩行代碼,在你的 web 瀏覽器中打開一個本地文件夾: 

  1. from pathlib import Path  
  2. import webbrowser  
  3. filename = Path("source_data/text_files/raw_data.txt")  
  4. webbrowser.open(filename.absolute().as_uri()) 

這只是「pathlib」的好處之一。它很好地替代了過去分散在不同 Python 模塊中與文件相關的許多不同功能。 

 

責任編輯:龐桂玉 來源: 馬哥Linux運維
相關推薦

2019-11-04 09:45:39

WindowsPython命令

2009-06-29 09:57:05

Unix

2022-11-10 15:17:43

Windows文件Linux

2012-08-16 10:35:50

Windows Pho

2013-02-20 15:59:50

Windows 8

2012-12-24 15:00:56

sis塞班

2009-11-06 18:58:21

Windows 7雙系統卸載

2022-12-01 08:30:15

API調用系統

2021-03-16 12:42:42

FreeDOS開源

2009-03-11 09:28:18

文件名亂碼下載瀏覽器PHP

2009-10-24 10:38:34

2024-02-01 18:06:04

Python編程系統

2010-01-14 10:07:08

VB.NET文件名排序

2009-11-02 11:13:06

VB.NET讀寫文件

2012-10-09 16:37:20

FastDFS

2012-05-08 15:03:53

Windows7庫功能

2011-07-11 14:20:19

2013-09-27 09:56:25

2009-08-17 09:39:40

C# Windows

2009-10-27 10:58:00

VB.NET文件名排序
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲444kkkk在线观看最新 | 九九精品在线 | 欧洲精品码一区二区三区免费看 | 久久久久亚洲精品 | 天堂一区二区三区 | 欧美成人精品激情在线观看 | 在线播放一区二区三区 | 日本天天操 | 国产www成人 | 精品av久久久久电影 | 日韩视频在线一区 | 成人欧美一区二区 | 国产一级免费视频 | 欧美一级片在线播放 | 久久蜜桃av| 美国十次成人欧美色导视频 | 国产精品福利在线观看 | 色www精品视频在线观看 | 久久久久久成人 | 懂色av色香蕉一区二区蜜桃 | 在线观看成人免费视频 | 午夜影院黄 | 狠狠插天天干 | 天天在线操 | 国产高清在线视频 | 91精品久久久 | av三级在线观看 | 99久久久无码国产精品 | www.久| 国产大毛片 | 日本三级电影在线免费观看 | 午夜视频网站 | 欧美一级片在线观看 | 精品一区二区三区在线观看国产 | 成人免费av | 欧美成人精品一区 | 四虎影院在线观看av | www.久草.com| 午夜影院普通用户体验区 | 日本一区二区高清视频 | 国产精品视频一区二区三区四区国 |