如何在python 3.0中将文件的各个部分写入单独的列表?

时间:2016-06-24 06:43:45

标签: python excel

我有一个这样的文本文件:

line 1
line 2
.
.
END OF SECTION 1, BEGIN SECTION 2
line 100
line 101
.
.
END OF SECTION 2, BEGIN SECTION 3
line 999
line 1000
.
.
END OF SECTION 3, BEGIN SECTION 4
END OF SECTION 4, BEGIN SECTION 5
line 5000
line 5001
.
.
END OF SECTION 5
Q

所以,这个文件有5个部分,每个部分有一个变量#记录/数据行(这些部分并不都具有相同的行数,有些部分根本没有任何数据)。 / p>

我的任务是阅读此文件并将每个部分删除到一个列表中(因此在我的示例中,我将最终得到5个单独的列表),然后将其写入由包含列表的工作表组成的excel工作簿。因此,我想最终得到5个我正在呼叫的列表:

section_01_log
section_02_log
section_03_log
section_04_log
section_05_log

然后,我的excel工作簿中将包含这5个选项卡/工作表。

目前,我正在努力完成第一部分(即创建列表),并希望得到一些帮助。一旦得到这个,我将在第二部分工作,即将列表写入excel工作簿。

这是我的代码

#read the file into a list named "input_file" already defined
datafile = open(os.path.join(path,'filename'))
for line in datafile:
    input_file.append(line)
datafile.close()

# parse the "input_file" list and write only section 1
for line in input_file:
    if line.startswith('END OF SECTION 1'):
        exit
    else:
        section_01_log.append(line)

不幸的是,这不起作用。 section_01_log继续使用input_file的整个内容编写。为什么?我如何将第一部分隔离到section_01_log中,然后对所有其他部分进行相同的操作?

2 个答案:

答案 0 :(得分:0)

因此,您可以使用此命令获得正确的列表:

myList = []
with open("test.txt", 'r') as fileopen:
    myList = [line.strip() for line in fileopen]
print (myList)

输出:

['line 1', 'line 2', 'END OF SECTION 1, BEGIN SECTION 2', 'line 100', 'line 101', 'END OF SECTION 2, BEGIN SECTION 3', 'line 999', 'line 1000', 'END OF SECTION 3, BEGIN SECTION 4', 'END OF SECTION 4, BEGIN SECTION 5', 'line 5000', 'line 5001', 'END OF SECTION 5']

如果你想写一个excel文件,我建议你一步一步地这样做:

  1. 隔离不同列表中的每个部分
  2. 创建excel文件
  3. 在excel文件中写下您的列表
  4. 1.分割列表的简单方法(它不是很干净,如果列表太多,就不应该重现):

    section1 = myList[0:myList.index("END OF SECTION 1, BEGIN SECTION 2")]
    section2 = myList[myList.index("END OF SECTION 1, BEGIN SECTION 2")+1 : myList.index("END OF SECTION 2, BEGIN SECTION 3")]
    section3 = myList[myList.index("END OF SECTION 2, BEGIN SECTION 3")+1 : myList.index("END OF SECTION 3, BEGIN SECTION 4")]
    section4 = myList[myList.index("END OF SECTION 3, BEGIN SECTION 4")+1 : myList.index("END OF SECTION 4, BEGIN SECTION 5")]
    section5 = myList[myList.index("END OF SECTION 4, BEGIN SECTION 5")+1 : myList.index("END OF SECTION 5")]
    

    基本上你只需要索引来拆分列表。容易吗?

    2.创建Excel文件并创建你的工作表。您需要导入xlwt:

    import xlwt
    
    xl = xlwt.Workbook(encoding="utf-8")
    
    section_01 = xl.add_sheet("section_01_log")
    section_02 = xl.add_sheet("section_02_log")
    section_03 = xl.add_sheet("section_03_log")
    section_04 = xl.add_sheet("section_04_log")
    section_05 = xl.add_sheet("section_05_log")
    

    3.您写入Excel文件并保存:)

    for i, r in enumerate(section1):
        section_01_log.write(i, 0, r)
    for i, r in enumerate(section2):
        section_02_log.write(i, 0, r)
    for i, r in enumerate(section3):
        section_03_log.write(i, 0, r)
    for i, r in enumerate(section4):
        section_04_log.write(i, 0, r)
    for i, r in enumerate(section5):
        section_05_log.write(i, 0, r)
    
    xl.save("logs.xls")  
    

    就像我之前所说的那样,有更简洁的方法,但我是新手...

答案 1 :(得分:0)

你的代码不起作用的原因是因为exit没有做你认为它做的事情,假设你想让它摆脱for循环,在这种情况下你想要{{1声明。 break是一个内置常量,在调用时 - 就像这样:exit - 引发exit(),并且是一种退出交互式解释器的便捷方式。由于你没有调用它,它只是求值为一个字符串,你的for循环继续。

https://docs.python.org/2/library/constants.html#exit

以下方法应该有效,它适用于具有多于或少于5个部分的文件,只要它的结构与您给出的结果类似,并且它使用非常基本的,命令式的python。我假设'Q'被用作发送

结束信号的sentinal值
SystemExit

with open('testing.txt') as f: log = {1:[]} i = 1 new_section = False # flag to prevent creating sections just for sentinel for line in f: line = line.strip() if line == 'Q': # if we have reached the end of the file break elif new_section: i += 1 log[i] = [] new_section = False if line.startswith('END OF SECTION'): new_section = True else: log[i].append(line) 现在是这样的字典:

log

这是从这个示例文本文件:

{1: ['line 1', 'line 2', 'line 3', 'line4'],
 2: ['line 100', 'line 101', 'line 102', 'line 103'],
 3: ['line 999', 'line 1000', 'line 1001', 'line 1003'],
 4: [],
 5: ['line 5000', 'line 5001', 'line 5002', 'line 5003']}