我有一个文件夹,里面都有文字文件,所有文件都有类似的名字:
2014521RNC Reax to Obama on VA.txt
2014520W.H. Evades Questions On When Obama.txt
2012517Updated Research/ Obama Vets Roll Out.txt
所以数字然后是字母和/或字符。在每个文本文件中,都有单词。我正在尝试编写一个脚本,它将获取第一个数字字符串并将其添加到标题为“date”的列中的csv。然后它应该取数字后面的字母和/或字符,并将它们放在标题为“标题”的列中。然后它应该获取文件中的文本并将其添加到标题为“内容”的列中。我有点远,但不是整支雪茄。当我运行下面的脚本时,所有这些脚本的日期= -1和标题= -1。我有什么不错的?
f = open('RNC.csv','w')
names = ['date', 'title', 'content']
dw = csv.DictWriter(f, names)
dw.writerow({k:k for k in names})
for root, dirnames, filenames in os.walk('.'):
for filename in filenames:
if not filename.endswith('.txt'):
continue
title = filename.find(r'\D*')
date = filename.find(r'^\d*')
open_doc = open(root + '/' + filename, 'r')
content = open_doc.read().rstrip()
open_doc.close()
dw.writerow({'date':date, 'title':title, 'content':content})
f.close()
答案 0 :(得分:1)
问题是filename.find(s)
会返回s
中子字符串filename
的位置。当找不到子字符串时,它返回-1
。
您可以使用正则表达式来执行匹配:
import re
for filename in filenames:
m = re.match("\A(\d+)(.*)\.txt\Z", filename)
if m:
date = m.group(1)
title = m.group(2)
...
答案 1 :(得分:-1)
您无法将正则表达式作为参数提供给str.find
方法,这会将它们解释为文字子字符串,以尝试在文件名中查找。可能你需要做的是这样的事情(在你的脚本顶部添加import re
之后):
match = re.search(r'^(\d+)', filename)
date = match.group(1) if match else 'None'
match = re.search(r'(\D+)', filename)
title = match.group(1) if match else 'None'