使用 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子串s
在filename
中的位置。它 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)
...
我有一个文件夹,里面装满了文本文件,所有文件的名称都与这些文件类似:
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子串s
在filename
中的位置。它 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)
...