【问题标题】:Manipulating data of file several times多次操作文件数据
【发布时间】:2016-04-06 18:12:13
【问题描述】:

文件操作有点麻烦。我想操作数据 2 次并将最后操作的数据写入同一个文件。

这是我处理的文件:

['Simon', 93.45000000000002, 'AA']
['Jane', 87.55000000000001, 'BA']
['Peter', 85.95, 'BA']

这是我如何更改文件中数据的代码。

for line in manipulated_file:
    line=line.split()
    list_to_be_written=[]
    for i in line:
        i=i.replace("['","")
        i=i.replace("'","")
        i=i.replace(",",":")
        i=i.replace("]","")
        list_to_be_written.append(i)
    list_to_be_written=" ".join(list_to_be_written)
    print list_to_be_written

它运行完美,但我无法将输出写入文件..

同一文件中的预期输出:

Simon: 93.45000000000002: AA
Jane: 87.55000000000001: BA
Peter: 85.95: BA

提前谢谢你。

【问题讨论】:

    标签: python string list file


    【解决方案1】:

    您可以使用ast.literal_eval

    from ast import literal_eval
    
    with open('demo.txt','r') as input_file, open('output.txt','a') as output:
        for line in input_file:
            temp = literal_eval(line)
            output.write(": ".join([repr(a) if type(a)== float else a for a in temp])+'\n')
    

    output.txt 的内容:

    Simon: 93.45000000000002: AA
    Jane: 87.55000000000001: BA
    Peter: 85.95: BA
    

    【讨论】:

      【解决方案2】:

      我相信,如果您希望将数据写入与初始数据相同的文件中,您必须先打开它进行读取,读入变量,处理它,然后打开它进行写入并写下所有需要。详情请见the docs

      with open("file.txt", "r") as manipulated_file:
          manipulated_file_lines = manipulated_file.readlines()
      with open("file.txt", "w") as  manipulated_file:
      
          for line in manipulated_file_lines:
              line=line.split()
              list_to_be_written=[]
              for i in line:
                  i=i.replace("['","")
                  i=i.replace("'","")
                  i=i.replace(",",":")
                  i=i.replace("]","")
                  list_to_be_written.append(i)
              list_to_be_written=" ".join(list_to_be_written)
              print list_to_be_written
      
              manipulated_file.write(list_to_be_written)
      

      附:我不确定您是否必须以这种方式手动处理您的线路。我相信最好使用json 解码器将它们转换为 Python 对象(例如列表),然后从该对象格式化输出字符串。这可以用来代替那些.replace()的:

      import json
      with open("file.txt", "r") as manipulated_file:
          manipulated_file_lines = manipulated_file.readlines()
      with open("file.txt", "w") as  manipulated_file:
          for line in manipulated_file_lines:
              processed_list = json.loads(line.replace("'",'"'))
              list_to_be_written=": ".join(map(str,processed_list))
              # this should be tweaked if you want full precision for numbers
      
              print list_to_be_written
      
              manipulated_file.write(list_to_be_written)
      

      您也可以使用ast.literal_eval 代替json.loads,请参阅the docsthis question

      【讨论】:

      • 感谢 Ilya,这对我真的很有帮助! :) 我对python很陌生,所以我对解码器或其他一些方法不太了解。但是,我会看看它。谢谢:3
      • 这不会产生预期的结果,它会失去精度。
      • @AhsanulHaque,我同意,但是如果确实需要,可以使用适当的 .format() 方法或 % 运算符来简单地解决这个问题。
      • @IlyaV.Schurov 顺便问一下,我想知道在操作数据 2 次、更改文件中的 unicode 后是否有可能?
      • 例如我用 ":" 改变了 "," ,但是改变其中一个 " ; " 和其中一个" : " 有可能吗@IlyaV.Schurov
      【解决方案3】:

      您可以使用ast.literal_eval 解析列表并使用fileinput.input 更改原始文件。

      import fileinput
      from ast import literal_eval
      import sys
      
      
      for line in fileinput.input("in.txt", inplace=1):
          sys.stdout.write(": ".join(map(str, literal_eval(line))) + "\n")
      

      这会给你:

      Simon: 93.45000000000002: AA
      Jane: 87.55000000000001: BA
      Peter: 85.95: BA
      

      你也可以通过拆分和剥离来做到这一点:

      import fileinput
      import sys
      for line in fileinput.input("in.txt", inplace=True):
          sys.stdout.write(":".join([w.strip("'") for w in line.strip("[]\n").split(", ")]) + "\n"
      

      这会为您提供相同的输出:

      Simon: 93.45000000000002: AA
      Jane: 87.55000000000001: BA
      Peter: 85.95: BA
      

      如果代码发生错误,您将丢失数据,因此更好的选择可能是写入tempfile,然后执行shutil.move

      from shutil import move
      from tempfile import NamedTemporaryFile
      
      with open("in.txt") as f, NamedTemporaryFile("w", dir=".", delete=False) as tmp:
          for line in f:
              tmp.write(": ".join([w.strip("'") for w in line.strip("[]\n").split(", ")]) + "\n")
      
      move(tmp.name,"in.txt")
      

      【讨论】:

      • @PadraicCunnigham .. 一个愚蠢的问题,stdout 是否总是指向一个文件?..你如何确保这一点?
      • 我认为你会失去浮点到 str 转换的精度。
      • @AhsanulHaque,如果您查看 OP 值,我认为这不是他们担心的问题。
      • @IronFist,文件输入占用标准输出,因此每次打印或标准输出写入都被定向到文件
      • @AhsanulHaque,这正是它在 python3 中产生的,所以没有混淆。您可以在 pytonn2 中将其格式化为您想要的任何精度
      猜你喜欢
      • 2011-01-21
      • 2014-05-18
      • 1970-01-01
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      • 2021-10-30
      • 1970-01-01
      • 2019-03-25
      相关资源
      最近更新 更多