os.makedirs ของ Python ไม่เข้าใจ“ ~” ในเส้นทางของฉัน


159

ฉันมีปัญหาเล็กน้อยกับ ~ ในเส้นทางของฉัน

ตัวอย่างรหัสนี้สร้างบางไดเรกทอรีที่เรียกว่า "~ / some_dir" และไม่เข้าใจว่าฉันต้องการสร้าง some_dir ในโฮมไดเรกทอรีของฉัน

my_dir = "~/some_dir"
if not os.path.exists(my_dir):
    os.makedirs(my_dir)

หมายเหตุนี่เป็นระบบที่ใช้ Linux

คำตอบ:


277

คุณต้องขยายเครื่องหมายตัวหนอนด้วยตนเอง:

my_dir = os.path.expanduser('~/some_dir')

1
ดังนั้นฉันไม่ได้ใช้ os.path.expanduser และทำสิ่งที่ OP ทำและหลามสร้างไดเรกทอรี "~" ในไดเรกทอรีปัจจุบันของฉัน ฉันจะลบไดเรคทอรี่นั้นได้อย่างไร (โดยไม่ต้องลบโฮมไดเร็กตอรี่จริง)?
Happy Mittal

1
@HappyMittal สำหรับคนอื่น ๆ ที่สงสัยคุณสามารถใช้./เพื่ออ้างอิงไดเรกทอรีปัจจุบันของคุณและทำให้./~การลบโฟลเดอร์~ในไดเรกทอรีปัจจุบัน rm -rf path/to/bad/dir/~การจะมีความปลอดภัยมากขึ้นก็เป็นที่ง่ายที่สุดที่จะเพียงแค่ให้เส้นทางแบบเต็ม:
alkasm

หรือเพียงแค่หลบหนีด้วยแบ็กสแลช:rm \~
DDMC

71

การแปลงของ~/some_dirถึง$HOME/some_dirเรียกว่าการขยายตัวตัวหนอนและเป็นคุณสมบัติส่วนต่อประสานผู้ใช้ทั่วไป ระบบไฟล์ไม่รู้อะไรเกี่ยวกับมัน

ใน Python คุณสมบัตินี้นำมาใช้โดยos.path.expanduser :

my_dir = os.path.expanduser("~/some_dir")

~อันที่จริงและมันก็เป็นที่ถูกต้องสมบูรณ์มีไฟล์หรือไดเรกทอรีชื่อ ดังนั้นทางลัดเชลล์เชลล์จะคลุมเครือและหลีกเลี่ยงได้ดีที่สุดถ้าทำได้
bobince

7
โปรดทราบว่าหนึ่งสามารถเข้าถึงไฟล์ / dir ชื่อ "~" ในไดเรกทอรีปัจจุบันแม้ในขณะที่การขยายตัวหนอนจะเกิดขึ้นโดยใช้สัญกรณ์ "./~" ใช้งานได้เนื่องจาก ~ การขยายจะเกิดขึ้นเมื่อเริ่มต้นชื่อไฟล์เท่านั้น นอกจากนี้ยังเป็นแฮ็คที่สะดวกสำหรับชื่อไฟล์ที่ขึ้นต้นด้วย "-" หรือตัวละครอื่น ๆ ที่ได้รับการดูแลเป็นพิเศษจากอินเตอร์เฟสบรรทัดคำสั่ง คุณบอกได้เลยว่าฉันอาจทำแฮ็คสคริปมากเกินไป
ddaa

The file system does not know anything about it.+1
Bin

15

นั่นอาจเป็นเพราะ Python ไม่ใช่ Bash และไม่ปฏิบัติตามอนุสัญญาเดียวกัน คุณสามารถใช้สิ่งนี้:

homedir = os.path.expanduser('~')

0
from srblib import verify_folder

verify_folder('path/to/folder')

มันจะสร้างโฟลเดอร์ถ้าไม่มีมันจะไม่สร้างโฟลเดอร์

หมายเหตุ : มันจะสร้างโฟลเดอร์ในเส้นทางด้วย (หากจำเป็น)

srb@srb-pc:~/hello$ ls
srb@srb-pc:~/hello$ python3 
>>> from srblib import verify_folder
>>> verify_folder('~/hello/A/B')
>>> exit()
srb@srb-pc:~/hello$ ls
A
srb@srb-pc:~/hello$ ls A
B
srb@srb-pc:~/hello$ 

ฟังก์ชั่นนี้ใช้งานได้เหมือน mkdir -p path/to/folder


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.