使用python将txt文件转换为CSV上的行

时间:2015-01-22 15:13:54

标签: python regex csv text-files

我有一个文件夹,里面都有文字文件,所有文件都有类似的名字:

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()

2 个答案:

答案 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'