作者s4028600 (佑)
看板Python
標題[問題] 提取txt內文後重命名檔名
時間Sat Dec 2 00:21:35 2017
首先我是個超級小白
這是我目前弄出來的東西
f = open('11.txt',encoding = 'utf8')
lines = f.readlines()
print (lines[2])
重命名還完全沒頭緒...之後再說...
首先有幾個問題
第1
11.txt只是其中一個檔案
一個一個改檔案名也太多了
我要如何自動處理多數檔案?
第2
我的py檔打算和txt放在一起
然後像bat檔一樣開啟後自動執行
有辦法嗎?
第3
有辦法保留執行畫面嗎?
像bat檔的pause
拜託各位幫忙了
感謝
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.41.70.16
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Python/M.1512145298.A.AC3.html
1F:→ BigBank: 1. os.walk() 2.3.看不太懂 寫bat檔執行python?12/02 01:02
2是我不太清楚python是如何執行的
所以希望像exe或bat開起就可以使用那樣
3是因為開py檔閃一下就消失了
和bat檔很像
而bat檔只要程式碼最後加入pause畫面就不會消失
※ 編輯: s4028600 (114.41.70.16), 12/02/2017 01:17:24
2F:→ s4028600: 查了一下os.walk看不懂 把os.walk放到open裡面?12/02 01:27
3F:→ stucode: 1. os.walk() 2. os.getcwd() 後 os.walk()12/02 05:02
4F:→ stucode: 3. input() 或者 os.system('pause')12/02 05:03
5F:→ stucode: os.walk() 搭配 for ... in 使用。原 PO 如果沒有程式12/02 05:03
6F:→ stucode: 基礎的話,建議先找個基本教學看到迴圈部分再回來寫。12/02 05:03
7F:推 TitanEric: 我都用os.listdir 不過樓上們提到的方法也可以12/02 18:16
抱歉各位
os.walk那些真的看不懂也試不出
但是在找資料找到這個
看可不可行
import glob
x=glob.glob('*.txt')
print(x)
f=open("x",encoding='utf8')
lines = f.readlines()
print (lines[2])
雖然成功列出txt檔
但是無法輸入到open()中
※ 編輯: s4028600 (114.41.70.16), 12/02/2017 21:57:03
8F:→ stucode: glob 也可以,但它是傳回檔名 list,一樣要搭配 for 迴圈12/02 22:28
9F:→ stucode: 來走訪每個檔案。12/02 22:29
11F:→ danny0838: 右上角有搜尋按鈕,想知道任何 API 的用途及可用參數都 12/02 23:11
12F:→ danny0838: 可以輸進去查。平常不記得網址只要Google搜python doc 12/02 23:11
13F:→ danny0838: 前幾項就能找到官網。 12/02 23:11
14F:→ danny0838: 如果英文還是有困難,也可以輸入中文關鍵字Google, 12/02 23:13
15F:→ danny0838: 比如 "python 檔案更名"、"python 列出檔案" 不過中文 12/02 23:14
16F:→ danny0838: 資料品質就不一定那麼好,另外也要注意python 2和3語法 12/02 23:14
17F:→ danny0838: 不同,有些比較舊的文章是python 2,現在多半用python12/02 23:14
18F:→ danny0838: 3,可能需要改一下程式碼才能用。12/02 23:15
19F:→ stucode: 如果不知道現在用的是哪個版本,可以這樣確認:12/02 23:18
20F:→ stucode: import sys12/02 23:19
21F:→ stucode: print(sys.version)12/02 23:19
感謝danny的建議
只是我都找過了(除了英文真的看不懂)
其實我這個程式碼
也是拿別人的範例東拼西湊實驗出來的
又改了下比剛剛好一些
但是那個該死的open真的搞不定
頭痛啊
import glob
for x in glob.glob('*.txt'):
print(x)
f=open('x',encoding='utf8')
lines = f.readlines()
print (lines[2])
※ 編輯: s4028600 (114.41.70.16), 12/02/2017 23:22:39
22F:→ stucode: open(x, ...) # x 不加括號。加括號的話會變成開啟檔名為 12/02 23:31
23F:→ stucode: x 的檔案。另外 f=open() 跟針對檔案處理的每個動作都要 12/02 23:32
24F:→ stucode: 縮排,Python 是以縮排來決定程式碼區塊的。 12/02 23:32
25F:→ stucode: * 抱歉,我是要說不加引號。 12/02 23:37
26F:→ s4028600: 行了 但是馬上出新問題... 只讀取最後一個檔案的第3行 12/03 00:01
27F:→ s4028600: 只好再試試了 12/03 00:01
只讀取最後一個檔案的問題先放一邊
import glob,os
for x in glob.glob('*.txt'):
print(x)
f=open(x,encoding='utf8')
lines = f.readlines()
print (lines[2])
os.rename(x,lines[2])
os.system("pause")
誰可以幫我測試一下
數據都是正確的
為什麼會無法更名
明明快完成了...好吐血...
※ 編輯: s4028600 (114.41.70.16), 12/03/2017 00:39:02
28F:→ danny0838: 縮排先弄正確,如果還是出錯要貼錯誤訊息才能判斷12/03 01:02
29F:→ danny0838: 一個可能原因是該行有某些字元不允許用於檔名12/03 01:02
30F:→ danny0838: 你得想好遇到不能用於檔名的字元要怎麼處理 12/03 01:02
31F:→ s4028600: 已經確定有兩個原因 一個是檔案被佔用 一個確實是字符 12/03 04:05
32F:→ s4028600: 字元有點頭痛 很難刪除 12/03 04:06
33F:→ s4028600: 但是不知道為什麼只讀取一個檔案很奇怪 是要用for嗎? 12/03 04:09
34F:→ s4028600: 試不出編碼 12/03 04:09
35F:→ stucode: 檔案佔用是因為開檔讀取後沒有關閉,兩個解決方法: 12/03 10:37
36F:→ stucode: f.close() 或 with open(...) as f:12/03 10:37
37F:→ stucode: 個人比較推薦後者,但前者對你來說可能比較好理解。12/03 10:37
38F:→ stucode: readlines() 讀取的字串中包含換行字元 '\n',要用於重新12/03 10:38
39F:→ stucode: 命名之前記得先裁掉(關鍵字:字串處理),其餘部分就是12/03 10:38
40F:→ stucode: danny 大提到的檔案系統不接受的字元,這部分依照需求12/03 10:38
41F:→ stucode: 處理方式不同,但一樣是做字串處理。只讀取最後一個檔案12/03 10:38
42F:→ stucode: 的問題,請去 google Python 縮排,中文資料也不少。12/03 10:38
43F:→ djshen: 你知道for loop怎麼用嗎?12/03 11:38
44F:→ djshen: 你要不要一步一步來 1讀單一檔案 2拿到正確檔名 3 rename12/03 11:46
45F:→ djshen: 4寫成loop形式12/03 11:47
46F:→ djshen: 全部混在一起你自己也不知道哪裡出問題12/03 11:47
47F:→ djshen: 沒人可以幫你測試 別人又沒有你的檔案12/03 11:48
48F:→ s4028600: ok 感謝 現在只剩下4寫成loop形式 但是寫不出解法…12/03 14:48
49F:→ s4028600: 縮排?都可以執行啊?12/03 14:54
import glob,os
for x in glob.glob('*.txt'):
print(x) #列出所有txt檔
f=open(x,encoding='utf8')#打開x
lines = f.readlines() #讀取檔案
print (lines[2]) #列出第3行
y=lines[2].lstrip('<') #同下
z=y.rstrip() #同下
c=z.rstrip('>') #刪除不要字元
f.close() #關閉檔案
os.rename(x,c) #重新命名
我如果要迴圈執行"打開檔案"到"重新命名"
直到所有txt檔命名完要怎麼寫
※ 編輯: s4028600 (125.230.131.184), 12/03/2017 15:46:49
50F:→ s4028600: 空白鍵在手機ptt會不見 要整頁模式 12/03 15:59
51F:→ youngman77: 你有把f=open之後的code都空四格嗎? 12/03 18:15
52F:推 ncueBenson: python 的for 是用空格控制唷 所以你在for的:之後 12/03 20:24
53F:→ ncueBenson: 有加上四格空格的都會在迴圈裡面 12/03 20:24
空格的沒有效果喔
不過突然成功了
雖然有無限迴圈的缺點...
import glob,os
while True:
for x in glob.glob('*.txt'):
print(x) #列出所有txt檔
f=open(x,encoding='utf8')#打開x
lines = f.readlines() #讀取檔案
print (lines[2]) #列出第3行
y=lines[2].lstrip('<') #同下
z=y.rstrip() #同下
c=z.rstrip('>') #刪除無法命名字元
f.close() #關閉檔案
os.rename(x,c) #重新命名
無限迴圈停不下來...
※ 編輯: s4028600 (125.230.131.184), 12/03/2017 21:47:03
54F:→ s4028600: 還好改名後不是txt檔12/03 21:47
55F:→ stucode: while True: 拿掉,for 前面不要有空格。 12/03 22:38
雖然不知道為什麼
但是終於運轉成功了
import glob,os
for x in glob.glob('*.txt'):
print(x) #列出所有txt檔
txt=open(x,encoding='utf8')#打開x
lines = txt.readlines() #讀取檔案
print (lines[2]) #列出第3行
a=lines[2].strip() #刪除
b=a.lstrip('<') #刪除從頭無法命名字元
c=b.rstrip('>') #刪除從尾無法命名字元
d=c.replace(':','') #刪除中間
e=d.replace('*','') #同上
f=e.replace('?','') #同上
txt.close() #關閉檔案
os.rename(x,f) #重新命名
os.system("pause")
雖然有重複檔名無法命名
跑出來的檔案要另外加txt的副檔名的一些缺點
那個刪除字元也相當困難
但是足夠我使用了
感謝各位的幫忙
這過程讓我知道
會寫程式的人真是厲害啊
其他的新手們也可以當作參考
感謝各位了
※ 編輯: s4028600 (125.230.131.184), 12/03/2017 23:17:15