0

我刚刚使用 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:需要读写多行文本文件

4

3 回答 3

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')
于 2013-05-06T18:03:33.143 回答
0

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

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

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

with open(directory, 'w') as f:
    f.writelines(lines)
于 2013-05-03T21:40:53.887 回答
-1
fileList = [line for line in open("file.txt")]

虽然前面提到的成语适用于读取文件,但我喜欢我的。它简短而切题。

于 2013-05-03T21:42:47.330 回答