2014-06-12 2 views
-2

여러 줄의 텍스트 파일이 있습니다. 나도 같은 텍스트 파일을 다시 작성하는 가장 좋은 방법이지만 둥근 값을 찾고반올림 값이있는 텍스트 파일의 행을 다시 쓰는 가장 좋은 방법

0.004061345 0.02444009 -0.02234149 -0.01368116 0.02479915 5.76696e-012

:

0.004 0.024 -0.022 -0.014 0.025 0.000

은 무엇 가장 파이썬 방법이 될 것입니다 각 행은 공백으로 구분 된 값을 가지고?

Here is my solution, a combinaison of PepperoniPizza and Jan Vlcinsky

코드 :

stringNewFile = '' 
i = 0 #-- My file as a header that I need to keep untouch 

with open('myfile.txt', 'rb') as fin: 
for line in fin.readlines(): 
    stringNewFile = stringNewFile + line if i < 6 else stringNewFile + " ".join(map(lambda itm: "{0:.3f}".format(float(itm)), line.split()))+'\n' 
    i = i + 1 


file_handle = open('myfile.txt', 'w') 
file_handle.write(stringNewFile) 
file_handle.close() 

건배!

+0

코드가 있습니까? 지금까지 가지고있는 것을 보여주십시오. 프로그램의 전제는 파일을 읽고, 각 공간에서 줄을 나누고, 문자열을 숫자로 변환하고, 숫자를 반올림하고, 다시 하나의 긴 문자열로 변환하고, 문자열을 다시 파일에 씁니다. 각 단계를 개별적으로 수행 한 다음 함께 사용하십시오. – Adam

+0

아마도 파일을 한 줄씩 읽은 다음 그 줄을 공백으로 나누어 목록으로 만들 것입니다. 그런 다음 목록의 각 요소를 반복하여 문자열을 부동 소수점 값으로 변환합니다. 그러면 float을 반올림하는'round' 함수를 호출 할 수 있습니다. 그 후 다시 파일로 다시 쓸 수 있습니다 – Elias

답변

1

각 줄을 읽고 줄을 별도의 줄로 나누고 각 줄을 float로 변환 한 다음 반올림 한 다음 새 파일에 씁니다.

fout = open('rounded.txt', 'wb') 

with open(input, 'rb') as fin: 
    for line in fin.readlines(): 
     values = line.split() 
     for val in values: 
      new_val = round(float(val), 3) # 3 digit precision 
      fout.write(new_val) 
      fout.write(' ') 
     fout.write('\n') 

fout.close() 
+0

첫 줄에 따옴표를 잊어 버리면 색을 내고 있습니다. – Elias

+0

@Elias, 고침, 고마워. – PepperoniPizza

+0

@Elias - 숫자를 3 자리 정밀도로 반올림해도 보장 할 수 없으며 그렇게 인쇄됩니다. 어떤 경우에는 방법으로 인해 작은 차이가 나타납니다. 숫자는 내부적으로 표현됩니다. 그러나 대부분의 경우에 괜찮을 것입니다. –

0

방법, 구분 기호로 공백이 같은 뭔가 CSV 라이브러리를 사용하는 방법에 대한 (라인 포맷) 얼마

import csv 

def test(): 
    out_csv_file = open('output.csv', 'w') 
    with open('test.csv', 'r') as in_csv_file: 
     reader = csv.reader(in_csv_file, delimiter=' ') 
     writer = csv.writer(out_csv_file, delimiter=' ') 
     for row in reader: 
      line_buffer = [] 
      for item in row: 
       line_buffer.append(round(float(item), 3)) 
      writer.writerow(line_buffer) 
0

을 : 단계별로

>>> textin = "0.004061345 0.02444009 -0.02234149 -0.01368116 0.02479915 5.76696e-012" 
>>> " ".join(map(lambda itm: "{:5.3f}".format(float(itm)), textin.split())) 
'0.004 0.024 -0.022 -0.014 0.025 0.000' 

단계 :

>>> textin = "0.004061345 0.02444009 -0.02234149 -0.01368116 0.02479915 5.76696e-012" 
>>> textin.split() 
['0.004061345', 
'0.02444009', 
'-0.02234149', 
'-0.01368116', 
'0.02479915', 
'5.76696e-012'] 
>>> num = 3.141516 
>>> "{:5.3f}".format(num) 
'3.142' 
>>> map(lambda itm: "{:5.3f}".format(float(itm)), textin.split()) 
['0.004', '0.024', '-0.022', '-0.014', '0.025', '0.000'] 
>>> " ".join(map(lambda itm: "{:5.3f}".format(float(itm)), textin.split())) 
'0.004 0.024 -0.022 -0.014 0.025 0.000' 

파일 변환 적용 :

infile = "input.txt" 
outfile = "output.txt" 
with open(infile) as f_in, open(outfile, "w") as f_out: 
    for line in f_in: 
     line = line.strip("\n") #remove trainilg newline, if present 
     line = " ".join(map(lambda itm: "{:5.3f}".format(float(itm)), textin.split())) 
     f_out.write(line + "\n") 

참고 : 한 번에 동일한 파일을 읽고 쓰려고하지 마십시오. 너무 어렵습니다.

+0

감사합니다. 나는 당신의 해결책을 찾아갔습니다. 잘 작동한다. 내 코드 예를 보려면 내 게시물을 참조하십시오. – orange

관련 문제