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

Turning txt files into rows on a CSV using python

我有一个文件夹,里面装满了文本文件,所有文件的名称都与这些文件类似:

2014521RNC Reax to Obama on VA.txt
2014520W.H. Evades Questions On When Obama.txt
2012517Updated Research/  Obama Vets Roll Out.txt

所以是数字,然后是字母 and/or 个字符。在每个文本文件中,都有单词。我正在尝试编写一个脚本,该脚本将采用第一个数字字符串并将其添加到标题为 "date." 的列中的 csv 然后它应该在数字后面采用字母 and/or 字符并将它们放入一个标题为 "title." 的列然后它应该将文件中的文本添加到标题为 "content." 的列中我有点远但不是整支雪茄。当我 运行 下面的脚本时,所有脚本的日期 = -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()

您不能将正则表达式作为参数提供给 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'

问题是filename.find(s)returns子串sfilename中的位置。它 returns -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)
    ...