使用Python拆分和保存csv文件中的文本块
我想将csv文件的每一行分割成多个文本块,并将它们保存为单独的文本文件(它只有一列,每一行包含一个文本块)。我的items_split函数可以很好地处理定义的文本块,但是当应用到csv文件时,我得到了错误 “文件”untitled.py,第25行,项目\u拆分 idx=文本行索引(“ABC”)+1 ValueError:“ABC”不在列表中” 我使用的代码如下:使用Python拆分和保存csv文件中的文本块,python,Python,我想将csv文件的每一行分割成多个文本块,并将它们保存为单独的文本文件(它只有一列,每一行包含一个文本块)。我的items_split函数可以很好地处理定义的文本块,但是当应用到csv文件时,我得到了错误 “文件”untitled.py,第25行,项目\u拆分 idx=文本行索引(“ABC”)+1 ValueError:“ABC”不在列表中” 我使用的代码如下: import re import uuid def items_split(file): data=file ##
import re
import uuid
def items_split(file):
data=file
## First, we want to remove all empty lines in the text files
data = re.sub(r'\n\s*\n','\n',data,re.MULTILINE)
data = re.sub(r'\n\s*\n','\n',data,re.MULTILINE)
data = re.sub(r'\n\s*\n','\n',data,re.MULTILINE)
data = re.sub(r'\n\s*\n','\n',data,re.MULTILINE)
data = re.sub(r'\n\s*\n','\n',data,re.MULTILINE)
data = re.sub(r'\n\s*\n','\n',data,re.MULTILINE)
data = re.sub(r'\n\s*\n','\n',data,re.MULTILINE)
data = re.sub(r'\n\s*\n','\n',data,re.MULTILINE)
## Then, we remove all lines up to ABC
text_lines = data.split("\n")
idx = text_lines.index("ABC") + 1
data = "\n".join(text_lines[idx:])
## Last, we split the text files into multiple files, each with a news item
current_file = None
for line in data.split('\n'):
# Set initial filename,
if current_file == None and line != '':
current_file = str(uuid.uuid4()) + '.txt' #this will assign a random file name
#current_file = line + '.txt'
# This is to handle the blank line after Brief
if current_file == None:
continue
text_file = open(current_file, "a")
text_file.write(line + "\n")
text_file.close()
# Reset filename if we have finished this section
# which is idenfitied by:
# starts with Demographics - ^Demographics
# contains some random amount of text - .*
# ends with ) - )$
if re.match(r'^Demographics:.*\)$', line) is not None:
current_file = None
import csv
with open('Book1.csv', 'rb') as csvfile:
spamreader = csv.reader(csvfile, delimiter=',')
for row in spamreader:
items_split(row)
例如,csv文件中的每一行如下所示:
“媒体新闻报道
ABC
专题1 dzfffa a Agasgeahryyeshdh
人口统计:12000人(男性16岁以上)•7000人(女性16岁以上)
专题2
fszg seez TRBWTTEWTMYTMUTRYRMUJFCJ
人口统计:10000人(男性16岁以上)•5000人(女性16岁以上)
您对这些内容满意吗?”
我想把它分成:
ABC
专题1 dzfffa a Agasgeahryyeshdh
人口统计:12000人(男性16岁以上)•7000人(女性16岁以上)
及
专题2
fszg seez TRBWTTEWTMYTMUTRYRMUJFCJ
人口统计:10000人(男性16岁以上)•5000人(女性16岁以上)
你对这些内容满意吗?"
并将每一行保存为单独的文本文件。我已经在文本本身上运行了该函数,它工作得非常好。问题是,当我在csv文件上运行它时,它不知何故无法识别每一行是一个文本块,我尝试将其转换为字符串等,但没有成功。您正在从csv传递一行,这是获得的列列表从一行文本,到
item\u split
函数,该函数需要一个换行分隔的行字符串,因此该函数肯定找不到您想要的任何内容
由于您显然已经知道每个文本块的主题名称,因此可以使用re.split
按已知主题名称模式分割csv:
import re
import uuid
with open('Book1.csv', 'r') as f:
texts = iter(re.split(r'^(ABC|Topic 2)$', f.read(), flags=re.MULTILINE)[1:])
for text in zip(texts, texts):
with open(str(uuid.uuid4()) + '.txt', 'w') as f:
f.write(''.join(text))
因此,第一个文件将具有:
ABC
Topic 1 dzfffa a agasgeaherhryyeshdh
Demographics: 12,000 (male 16+) • 7,000 (female 16+)
Topic 2
fszg seez trbwtewtmytmutryrmujfcj
Demographics: 10,000 (male 16+) • 5,000 (female 16+)
Are you happy with this content?
第二个文件将具有:
ABC
Topic 1 dzfffa a agasgeaherhryyeshdh
Demographics: 12,000 (male 16+) • 7,000 (female 16+)
Topic 2
fszg seez trbwtewtmytmutryrmujfcj
Demographics: 10,000 (male 16+) • 5,000 (female 16+)
Are you happy with this content?
Python有一个很好的库,用于导入和读取CSV文件。永远不要重新发明轮子 从文档中可以看到一个简短的示例,说明如何读取CSV文件
import csv
with open('eggs.csv', 'rb') as csvfile:
spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')
for row in spamreader:
print ', '.join(row)
此模块的工作原理类似,只是现在它返回OrderedDict[]类型,这使文件导航更加容易
import csv
with open('names.csv', newline='') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
print(row['first_name'], row['last_name'])
CSV(逗号分隔值)。您的文件可能有CSV扩展名,但实际上不是CSV,因为它没有逗号作为分隔符。这将在尝试使用CSV库时导致未定义的行为。