将多行写入文件,然后使用Python读取它们

时间:2013-05-03 21:35:57

标签: python text multiline

我刚刚用Python创建了我的第一个合适的项目,这是一个代码片段存储程序。 为此,我需要首先将多行写入,然后读取.txt文件。我已经完成了相当多的谷歌搜索,并发现了一些关于写入文件的事情(这没有真正起作用)。我目前工作的是一个函数,它读取多行输入的每一行,并在将其写入文件之前将其写入列表。我原以为我只能从文本文件中读取它并将每行添加到列表中然后使用while循环分别打印每一行,遗憾的是这不起作用。 在做了更多的研究之后,我决定在这里问一下。这是我目前的代码:

'''
Project created to store useful code snippets, prehaps one day it will evolve
into something goregous, but, for now it's just a simple archiver/library
'''

#!/usr/local/bin/python

import sys, os, curses

os.system("clear")

Menu ="""
                #----------- Main Menu ---------#

                #   1. Create or edit a snippet #
                #   2. Read a snippet           # 
                #   0. Quit                     #

                #-------------------------------#
\n
"""

CreateMenu ="""
        #-------------- Creation and deletion --------------#

        #   1. Create a snippet                             #
        #   2. Edit a snippet                               # 
        #   3. Delete a snippet (Will ask for validation)   #
        #   0. Go back                                      #           

        #---------------------------------------------------#
\n
"""

ReadMenu="""
                  #------ Read a snippet ------#

                  #   1. Enter Snippet name    #
                  #   2. List alphabetically   #
                  #   3. Extra                 #
                  #   0. Go Back               #

                  #----------------------------#

"""

def readFileLoop(usrChoice, directory):
    count = 0

    if usrChoice == 'y' or 'n':
        if usrChoice == 'y':
            f = open(directory, 'r')
            text = f.read()
            f.close() 

            length = len(text)
            print text
            print length

            raw_input('Enter to continue')
            readMenu()
            f.close()
        elif choice == 'n':
            readMenu()



def raw_lines(prompt=''):
   result = []
   getmore = True
   while getmore:
      line = raw_input(prompt)
      if len(line) > 0:
         result.append(line)
      else:
         getmore = False
   result = str(result)
   result.replace('[','').replace(']','')
   return result


def mainMenu():
    os.system("clear")
    print Menu
    choice = ''
    choice = raw_input('--: ')
    createLoop = True    

    if choice == '1':
            return creationMenu()

    elif choice == '2':
        readMenu()

    elif choice == '0':
        os.system("clear")
        sys.exit(0)

def create():
        os.system("clear")
        name = raw_input("Enter the file name: ")
        dire = ('shelf/'+name+'.txt')

        if os.path.exists(dire):
            while os.path.exists(dire):
                os.system("clear")
                print("This snippet already exists")
                name = raw_input("Enter a different name: ")
                dire = ('shelf/'+name+'.txt')

            print("File created\n")
            f = open(dire, "w")
            print("---------Paste code below---------\n")
            text = raw_lines()
            raw_input('\nEnter to write to file')
            f.writelines(text)
            f.close()
            raw_input('\nSnippet successfully filled, enter to continue')


        else:
            print("File created")
            f = open(dire, "w")
            print("---------Paste code below---------\n")
            text = raw_lines()
            print text
            raw_input('\nEnter to write to file')
            f.writelines(text)
            f.close()
            raw_input('\nSnippet successfully filled, enter to continue')

def readMenu():
    os.system("clear")

    name = ''
    dire = ''

    print ReadMenu 
    choice = raw_input('--:') 

    if choice == '1':
        os.system("clear")
        name = raw_input ('Enter Snippet name: ')
        dire = ('shelf/'+name+'.txt')

        if os.path.exists(dire):
            choice = ''
            choice = raw_input('The Snippet exists! Open? (y/n)')

            '''if not choice == 'y' or 'n':
                while (choice != 'y') or (choice != 'n'):
                    choice = raw_input('Enter \'y\' or \'n\' to continue: ')
                    if choice == 'y' or 'n':
                        break'''

            readFileLoop(choice, dire)

        else:
            raw_input('No snippet with that name exists. Enter to continue: ') #add options to retry, create snippet or go back
            readMenu()

    elif choice == '0':
        os.system("clear")
        print Menu 

def creationMenu():             ###### Menu to create, edit and delete a snippet ######
        os.system("clear")

        print CreateMenu
        choice = raw_input('--: ')

        if choice == '1':               ### Create a snippet
            os.system("clear")
            print create()
            print creationMenu()

        elif choice == '2':
            os.system("clear")          ### Edit a snippet
            print ("teh editon staton")
            raw_input()
            print creationMenu()

        elif choice == '3':
            os.system("clear")          ### Delete a snippet
            print ("Deletion staton")
            raw_input()
            print creationMenu()

        elif choice == '0':             ### Go Back
            os.system("clear")



######## Main loop #######

running = True

print ('Welcome to the code library, please don\'t disturb other readers!\n\n')

while running:  
    mainMenu()

######## Main loop #######

Tl; Dr:需要编写和阅读多行文本文件

3 个答案:

答案 0 :(得分:1)

  

我遇到的问题是多行存储到文件的方式,它以列表格式存储,例如['line1', 'line2', 'line3'],这使得难以作为多行读取,因为我无法将其转换为多行作为列表读取,当我尝试它时将整个存储的字符串添加到一个列表项中。我不知道我是否正确写入文件。

好的,问题在于文件。你正确阅读它,它只是没有你想要的数据。问题出在你的raw_lines函数中。首先,它汇总了result变量中的行列表,这很好。然后它这样做:

result = str(result)
result.replace('[','').replace(']','')

这里有两个小问题和一个大问题。

首先,replace

  

返回[s]字符串的副本,其中所有出现的子字符串 old 都替换为 new

Python字符串是不可变的。他们的方法都没有就地改变它们;所有这些都返回一个新的字符串。你没有对这个新字符串做任何事情,所以该行没有效果。

其次,如果要将字符串序列连接到字符串中,则不要通过调用序列上的str然后尝试解析它来执行此操作。这就是join方法的用途。例如,如果您的行已经以换行符结尾,则需要''.join(result)。如果没有,您需要'\n'.join(result) + '\n'之类的内容。你正在做的事有各种各样的问题 - 你忘记删除额外的逗号,你将删除任何括号(或逗号,一旦你修复它)在字符串本身等等。

最后,你不应该首先这样做。您想要返回可以传递给writelines的内容,其中包含:

  

将[s]字符串序列写入文件。序列可以是生成字符串的任何可迭代对象,通常是字符串列表。

你有一个字符串列表,这正是writelines想要的。不要试图将它们连接成一个字符串。如果你这样做,它会运行,但它不会做正确的事情(因为一个字符串本身就是一个1字符的字符串序列)。

因此,如果您只是完全删除这两行,那么您的代码几乎可以正常工作。

但最后一个问题是:raw_input

  

...从输入中读取一行,将其转换为字符串(剥离尾随换行符),然后返回。

但是writelines

  

...不添加行分隔符。

所以,你最终将所有的线连接在一起。您需要换行符,但raw_input会将它们抛弃。所以,你必须重新添加它们。您可以通过简单的单行更改来解决此问题:

result.append(line + '\n')

答案 1 :(得分:0)

要从文件中读取多行,最简单的方法是使用readlines(),它将返回文件中所有行的列表。要阅读文件,请使用:

with open(directory, 'r') as f:
    lines = f.readlines()

要写出您的更改,请使用:

with open(directory, 'w') as f:
    f.writelines(lines)

答案 2 :(得分:-1)

fileList = [line for line in open("file.txt")]

虽然前面提到的习语会用于阅读文件,但我喜欢我的。它简短而重要。