【问题标题】:How to read a text file into a string variable and strip newlines?如何将文本文件读入字符串变量并去除换行符?
【发布时间】:2012-01-12 05:50:25
【问题描述】:

我使用以下代码段在 python 中读取文件:

with open ("data.txt", "r") as myfile:
    data=myfile.readlines()

输入文件是:

LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN
GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE

当我打印数据时,我得到了

['LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN\n', 'GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE']

正如我所见,数据采用list 形式。我如何使它成为字符串?还有如何从中删除"\n""[""]" 字符?

【问题讨论】:

  • 标题和问题不一致。你真的想摆脱 \n 吗?
  • 您真的想从文件/字符串内容中删除换行符,还是您只是对打印输出中的许多元字符感到困惑,并且实际上想要保留换行符,但不显示它们作为“\n”?
  • 您真的要将整个文本读入一个字符串变量吗?你真的是用“strip newlines”来用空字符串替换它们吗?这意味着,一行的最后一个单词和下一行的第一个单词是连接在一起的,而不是分开的。我不知道您的用例,但这似乎是一个奇怪的要求。如果您解释一下您打算如何处理读入数据,我可能会有另一个答案

标签: python string


【解决方案1】:

你可以使用:

with open('data.txt', 'r') as file:
    data = file.read().replace('\n', '')

或者如果文件内容保证为一行

with open('data.txt', 'r') as file:
    data = file.read().rstrip()

【讨论】:

  • 直接写open("data.txt").read().replace('\n','')有什么不好的地方吗?
  • 是的,您的版本没有明确关闭文件,然后将延迟到垃圾收集器运行或程序终止。 'with' 语句通常封装了一些设置/拆卸打开/关闭操作。
  • 感谢您的澄清。所以,似乎我的版本对于小脚本来说可能没问题 - 但 OTOH 最好完全避免它,以免养成习惯。
  • @tuomassalo 它是测试/调试过程中的一个巨大的 PITA,因为如果您必须提前终止或遇到异常,它不会清理打开的文件句柄。
  • 不,rstrip('\n') 只会删除最后一行的换行符,replace('\n','') 会在任何地方删除它(基本上是使整个文件变成一行)
【解决方案2】:

在 Python 3.5 或更高版本中,使用pathlib 可以将文本文件内容复制到变量中并在一行中关闭文件

from pathlib import Path
txt = Path('data.txt').read_text()

然后您可以使用str.replace 删除换行符:

txt = txt.replace('\n', '')

【讨论】:

  • 这是迄今为止最优雅的解决方案。我更喜欢像 R 的 read_file 这样的单线解决方案
【解决方案3】:

您可以在一行中读取文件:

str = open('very_Important.txt', 'r').read()

请注意,这不会显式关闭文件。

当文件作为垃圾回收的一部分退出时,CPython 将关闭文件。

但其他 python 实现不会。要编写可移植代码,最好使用with 或显式关闭文件。短并不总是更好。见https://stackoverflow.com/a/7396043/362951

【讨论】:

  • 这是反惯用的,不推荐。 open 应在 with ... as 语句中使用。
  • @J.C 你能解释一下这个问题吗?这只是一个习惯问题还是with ... as 声明带来了什么?
  • @Titou 问题是 open.read() 不会关闭文件,所以我们需要with ... asstr.close(),如佩德罗的回答所示。更多关于关闭文件的重要性here
  • @JBallin。这个成语清楚地消除了错误的根源。谢谢!
  • 这也很糟糕,因为您刚刚从内置函数中屏蔽了 str()
【解决方案4】:

要将所有行加入一个字符串并删除新行,我通常使用:

with open('t.txt') as f:
  s = " ".join([l.rstrip() for l in f]) 

【讨论】:

  • 它在我的代码中给出了 UnicodeDecodeError 看到这个stackoverflow.com/q/18649512/9339242
  • 您可能需要指定字符编码。
  • 也将删除尾随空格,因此s = " ".join([l.replace("\n", "") for l in f]) 可能更好
【解决方案5】:
with open("data.txt") as myfile:
    data="".join(line.rstrip() for line in myfile)

join() 将加入一个字符串列表,不带参数的 rstrip() 将从字符串末尾删除空格,包括换行符。

【讨论】:

    【解决方案6】:

    这可以使用 read() 方法来完成:

    text_as_string = open('Your_Text_File.txt', 'r').read()
    

    或者由于默认模式本身是'r'(读取)所以简单地使用,

    text_as_string = open('Your_Text_File.txt').read()
    

    【讨论】:

    • 请注意,这会使文件无限期打开。
    【解决方案7】:

    我很惊讶还没有人提到splitlines()

    with open ("data.txt", "r") as myfile:
        data = myfile.read().splitlines()
    

    变量data 现在是一个列表,打印时看起来像这样:

    ['LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN', 'GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE']
    

    注意没有换行符 (\n)。

    此时,您似乎想将这些行打印回控制台,您可以使用 for 循环来实现:

    for line in data:
        print(line)
    

    【讨论】:

      【解决方案8】:

      我已经摆弄了一段时间,并且更喜欢将readrstrip 结合使用。如果没有rstrip("\n"),Python 会在字符串末尾添加一个换行符,这在大多数情况下并不是很有用。

      with open("myfile.txt") as f:
          file_content = f.read().rstrip("\n")
          print(file_content)
      

      【讨论】:

        【解决方案9】:

        很难确切地说出你在追求什么,但这样的事情应该能让你开始:

        with open ("data.txt", "r") as myfile:
            data = ' '.join([line.replace('\n', '') for line in myfile.readlines()])
        

        【讨论】:

        • reduce(lambda x,y : x+y.rstrip('\n'), ['a\n', "b\n", 'c'], "") 是很多冷却器:D
        • @Duncan 你有什么建议?
        • data = ' '.join(line.replace('\n', '') for line in myfile) 或 MagerValp 的版本。
        【解决方案10】:

        你可以把它压缩成一成两行的代码!!!

        content = open('filepath','r').read().replace('\n',' ')
        print(content)
        

        如果您的文件内容为:

        hello how are you?
        who are you?
        blank blank
        

        python 输出

        hello how are you? who are you? blank blank
        

        【讨论】:

        • 我喜欢这种解决方案,因为一行的最后一个单词将与下一行的第一个单词用空格隔开。但是我建议使用with 语句。所以像with open("filepath", "r") as fin: content = fin.read().replace("\n", " ")这样的东西但是如果当然它不确定原始海报是否需要这个
        【解决方案11】:

        您还可以剥离每一行并连接成一个最终字符串。

        myfile = open("data.txt","r")
        data = ""
        lines = myfile.readlines()
        for line in lines:
            data = data + line.strip();
        

        这样也行。

        【讨论】:

        • data = data + line.strip(); 可以简化为data += line.strip();
        • 对于大文件效率非常低(会发生大量内存分配和内存复制。最好创建剥离行列表,然后使用 " ".join()`
        【解决方案12】:

        这是一个单行、可复制粘贴的解决方案,它也关闭了文件对象:

        _ = open('data.txt', 'r'); data = _.read(); _.close()
        

        【讨论】:

          【解决方案13】:

          python3:如果方括号语法对您来说是新的,请谷歌“列表理解”。

           with open('data.txt') as f:
               lines = [ line.strip('\n') for line in list(f) ]
          

          【讨论】:

          • 非常pythonic,对我来说工作得很好,虽然我还没有测试过大文件。谢谢!
          • 我将撤回我的赞成票,因为 strip 也会去除空格,这可能不是所需的行为。但是,我仍然认为修改版本会很好。
          • lines = list(map(str.strip, f))?
          【解决方案14】:

          Oneliner:

          • 列表:"".join([line.rstrip('\n') for line in open('file.txt')])

          • 生成器:"".join((line.rstrip('\n') for line in open('file.txt')))

          List 比生成器快,但在内存上更重。生成器比列表慢,并且对于内存(例如遍历行)更轻。在“”.join()的情况下,我认为两者都应该工作得很好。 .join() 函数应该被删除以分别获取列表或生成器。

          • 注意:可能不需要 close() / 关闭文件描述符

          【讨论】:

            【解决方案15】:

            你试过了吗?

            x = "yourfilename.txt"
            y = open(x, 'r').read()
            
            print(y)
            

            【讨论】:

            • 这是错误的。如果你打算这样做,你想要 y = open(x, 'r').read()。
            【解决方案16】:

            要使用 Python 删除换行符,您可以使用字符串的 replace 函数。

            此示例删除所有 3 种类型的换行符:

            my_string = open('lala.json').read()
            print(my_string)
            
            my_string = my_string.replace("\r","").replace("\n","")
            print(my_string)
            

            示例文件为:

            {
              "lala": "lulu",
              "foo": "bar"
            }
            

            您可以使用此回放场景进行尝试:

            https://repl.it/repls/AnnualJointHardware

            【讨论】:

              【解决方案17】:
              f = open('data.txt','r')
              string = ""
              while 1:
                  line = f.readline()
                  if not line:break
                  string += line
              
              f.close()
              
              
              print(string)
              

              【讨论】:

              • 应该避免使用string += line 的循环。某些版本的 Python 可能会设法避免此处的 O(n^2) 行为,但已给出的任何其他答案都比这更好。此外,您没有删除请求的换行符,因此您的代码只是一种非常缓慢的方式 string = f.read()
              • 感谢您的指正。但一件小事是我不必删除新行,因为当我测试时,它没有打印出'\n'。 @邓肯
              • 对于大文件来说效率很低。对于每次迭代,都必须分配内存并复制数据。另外:新行既没有被删除也没有被替换为“”尝试使用以下命令查看,新行仍然包含。 print(repr(string))
              【解决方案18】:

              我认为没有人回答您问题的 [ ] 部分。当您将每一行读入变量时,因为在将 \n 替换为 '' 之前有多行,您最终会创建一个列表。如果你有一个变量 x 并通过

              打印出来

              x

              或打印(x)

              或str(x)

              您将看到带有括号的整个列表。如果您调用(排序数组)的每个元素

              x[0] 然后它省略了括号。如果您使用 str() 函数,您将只看到数据而不是 '' 。 str(x[0])

              【讨论】:

                【解决方案19】:

                也许你可以试试这个?我在我的程序中使用它。

                Data= open ('data.txt', 'r')
                data = Data.readlines()
                for i in range(len(data)):
                    data[i] = data[i].strip()+ ' '
                data = ''.join(data).strip()
                

                【讨论】:

                  【解决方案20】:

                  正则表达式也可以:

                  import re
                  with open("depression.txt") as f:
                       l = re.split(' ', re.sub('\n',' ', f.read()))[:-1]
                  
                  print (l)
                  

                  ['我','感觉','空','和','死','里面']

                  【讨论】:

                    【解决方案21】:
                    with open('data.txt', 'r') as file:
                        data = [line.strip('\n') for line in file.readlines()]
                        data = ''.join(data)
                    

                    【讨论】:

                      【解决方案22】:

                      这有效: 将您的文件更改为:

                      LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE
                      

                      然后:

                      file = open("file.txt")
                      line = file.read()
                      words = line.split()
                      

                      这将创建一个名为 words 的列表,它等于:

                      ['LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN', 'GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE']
                      

                      去掉了“\n”。要回答有关括号妨碍您的部分,只需执行以下操作:

                      for word in words: # Assuming words is the list above
                          print word # Prints each word in file on a different line
                      

                      或者:

                      print words[0] + ",", words[1] # Note that the "+" symbol indicates no spaces
                      #The comma not in parentheses indicates a space
                      

                      这会返回:

                      LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN, GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE
                      

                      【讨论】:

                      • 更改文件可能在一次性情况下有效,但如果您有数百个文件,这不是一个可行的解决方案。
                      【解决方案23】:
                      with open(player_name, 'r') as myfile:
                       data=myfile.readline()
                       list=data.split(" ")
                       word=list[0]
                      

                      此代码将帮助您阅读第一行,然后使用列表和拆分选项,您可以将由空格分隔的第一行单词转换为存储在列表中。

                      您可以轻松访问任何单词,甚至将其存储在字符串中。

                      您也可以使用 for 循环来做同样的事情。

                      【讨论】:

                        【解决方案24】:
                        file = open("myfile.txt", "r")
                        lines = file.readlines()
                        str = ''                                     #string declaration
                        
                        for i in range(len(lines)):
                            str += lines[i].rstrip('\n') + ' '
                        
                        print str
                        

                        【讨论】:

                          【解决方案25】:

                          尝试以下方法:

                          with open('data.txt', 'r') as myfile:
                              data = myfile.read()
                          
                              sentences = data.split('\\n')
                              for sentence in sentences:
                                  print(sentence)
                          

                          注意:它不会删除\n。只是为了查看文字,好像没有\n

                          【讨论】:

                            猜你喜欢
                            • 2012-11-10
                            • 2021-06-04
                            • 2021-04-16
                            • 1970-01-01
                            • 1970-01-01
                            • 2012-01-11
                            • 2013-03-28
                            相关资源
                            最近更新 更多