使用Python分割并保存csv文件中的文本块

时间:2018-09-28 00:09:13

标签: python

我想将一个csv文件的每一行拆分为多个文本块,并将它们保存为单独的文本文件(它只有1列,每一行包含一个文本块)。我的items_split函数在定义的文本块中可以很好地工作,但是将其应用于csv文件时出现错误

  

“文件“ untitled.py”,第25行,位于items_split中       idx = text_lines.index(“ ABC”)+1

     

ValueError:“ ABC”不在列表中”

我使用的代码如下:

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 agasgeaherhryyeshdh

     

受众特征:12,000(16岁以上男性)•7,000(16岁以上女性)

     

主题2

     

fszg seez trbwtewtmytmutryrmujfcj

     

受众特征:10,000(16岁以上的男性)•5,000(16岁以上的女性)

     

您对此内容满意吗? “

我想将其拆分为:

  

ABC

     

主题1 dzfffa a agasgeaherhryyeshdh

     

受众特征:12,000(16岁以上男性)•7,000(16岁以上女性)

  

主题2

     

fszg seez trbwtewtmytmutryrmujfcj

     

受众特征:10,000(16岁以上的男性)•5,000(16岁以上的女性)

     

您对此内容满意吗? “

,并将每个另存为单独的文本文件。我已经在文本本身上运行了该功能,并且效果很好。问题是,当我在csv文件上运行它时,某种程度上它无法识别每一行都是文本块,因此我尝试将其转换成徒劳的字符串等。

2 个答案:

答案 0 :(得分:1)

Python有一个很棒的库,用于导入和读取CSV文件。 永远不要重新发明轮子

CSV Python 2.X

该文档中的一个简短示例说明了如何从CSV文件中进行读取。

import csv
with open('eggs.csv', 'rb') as csvfile:
     spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')
     for row in spamreader:
         print ', '.join(row)

CSV Python 3.x

此模块的工作原理类似,只是现在返回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'])

答案 1 :(得分:0)

您要将一行从csv(仅从一行文本获得的列的列表)传递到item_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?