作者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/cn.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