2013-04-12 2 views
1

이 프로젝트는 파이썬으로 작성해야하지만 전체 초보자에게는 매우 어렵습니다. 기본적으로 파이썬으로 프로그래밍 한 적이 없으며 어제부터 학습을 시작한 Google 만 있기 때문에 문제를 해결할 수도 없기 때문에 도움을받을 수 있다고 생각했습니다.텍스트 파일에서 특정 정보를 선택하여 파이썬의 배열/목록으로 변환

내가 초기 TEXTFILE을 제공하고,의는 다음과 같은 방식으로 다음과 같은 데이터를 가지고있는, input.txt를 호출하자

Thomas Hales 
12 2345 
45 6780 

Peter Lebones 
10 15430 
11 1230 
23 3450 
John White 
2 12130 
11 32410 
15 4520 

그들 아래에 주어진 이름과 전화 번호가 있습니다. 왼쪽 열의 숫자는이 문제를 해결하기위한 간단한 식별 번호입니다. 오른쪽 열에있는 숫자는 사람들이 은행에 투자 한 금액을 말합니다.

텍스트 파일의 모든 데이터를 가져 와서 조작 한 다음 새로운 텍스트 파일을 만듭니다 (이 모든 작업은 python으로 실행되는 스크립트에 의해 수행됩니다). output.txt라고하는 예 이상이 포함

내가 여기까지 (하지만 작동하지 않습니다 전혀 플러스 그것의 총 엉망이 있고, 나 또한 정말 모르는 누군가의 도움으로 무엇을했는지
Thomas Hales 45 
Peter Lebones 10 
John White 11 

.. 그가하는 일) :

import sys 
import subprocess 
import re 
import string 


try: 
    fread=open(sys.argv[1]).readlines() 
except IOError: 
    print "There is no file like that!" 
    sys.exit() 
except IndexError: 
    print "There is no argumentum given" 
alpha = string.ascii_letters 
writeout=open("result.txt","w") 
inputarray=fread.readlines() 
for ... in inputarray: # not sure what goes in the "..." part 
    array=inputarray.split('\n') 
for i in range(len(array)-1): 
    if array[i].isalpha(): 
    writeout.write(array[i]+" ") 

fread.close() 
writeout.close() 

그래서 기본적으로 텍스트 파일이 제공됩니다. 나는 각각의 사람들을 위해 가장 높은 투자를 선택하고 왼쪽 열에있는 숫자를 가장 높은 투자라고 말하기로되어 있습니다. 그런 다음 스크립트를 각 사람의 이름과 최고 투자금의 "Id 번호"가 포함 된 output.txt로 만들어야합니다.

답변

2

라인이 숫자로 시작하면 우리는 투자를하고, 그렇지 않으면 이름이 있다고 가정합니다.

당신이 이름을 찾을 이전 이름과 가장 높은 투자 식별자 써마다 : 귀하의 예를 입력하여

with open(sys.argv[1]) as inputfile, open("result.txt","w") as outputfile: 
    name = None 
    investment_id = max_investment = 0 
    for line in inputfile: 
     if not line.strip(): continue # skip empty lines 

     if not line[:1].isdigit(): # name 
      if name and investment_id: 
       # write previous name 
       outputfile.write('{} {}\n'.format(name, investment_id)) 
      name = line.strip() 
      investment_id = max_investment = 0 

     else: 
      id, investment = [int(i) for i in line.split()] 
      if investment > max_investment: 
       max_investment = investment 
       investment_id = id 

    if name and investment_id: 
     # write last name 
     outputfile.write('{} {}\n'.format(name, investment_id)) 

를,이 글을 참고하세요 : 처리를 위해 아마이 기본 조리법

Thomas Hales 45 
Peter Lebones 10 
John White 11 
+0

도와 주셔서 감사합니다 많이. 유일한 것은 execfile ("filename.py", 'input.txt')을 사용하여 실행하려고했지만 TypeError는 str이 아닌 dict이어야합니다. 일반적으로 python filename.py 'input.txt'로 실행하는 것이 더 좋지만 실제로는 Windows 7을 실행하고 있고 어제 한시간 동안 python file.py로 파일을 열려고 시도했지만 아무 것도 효과가 없었습니다. 이 파일은 python.exe와 같은 경로에 있으므로 잘못되었는지 확실하지 않습니다. – user1966576

+0

Ah 방금 execfile로 인수를 전달할 수 없다는 것을 읽었습니다 ... 그러나 전통적인 python script.py arg1 방식으로 스크립트를 열 수는 없으며 서브 프로세스가 작동하지 않습니다 ... 파일을 실행할 수 있습니다 execfile과 함께하지만 그것은 인수가 누락되었다고 말합니다 ... – user1966576

+0

'subprocess'는 Windows에서 잘 작동해야합니다. 파일에 * 전체 * 경로를 사용해야합니다. –

1

을 줄 단위로 파일을 작성하면 오른발에서 시작할 수 있습니다.

import sys 

file_name = sys.argv[1] 

# This takes care of closing the file after we're done processing it. 
with open(file_name) as file_handle: 

    # Once we have a file handle, we can iterate over it. 
    for line in file_handle: 

     # This is where your real programming logic will go. 
     # For now, we're just printing the input line. 
     print line, 

나는 당신이 떨어져 숫자 라인을 깰 수 있기 때문에 당신은 또한, 유용 할 split()을 찾을 수 있습니다 생각한다. 예를 들어, 당신은 어떻게 작동 실험이 시도 할 수 :

parts = line.split() 
print parts 
1

당신에게 좋은 발사 플랫폼을 제공 할 수 있습니다 파이썬 re 모듈을 사용하여, 단순히 반복 할 수있는 무언가에 선을 무너 뜨.

>>> results = re.findall("(\w+) (\w+)",buff,re.S) 
[('Thomas', 'Hales'), ('12', '2345'), ('45', '6780'), ('63', '3210'), ('Peter', 'Lebones'), ('10', '15430'), ('23', '3450'), ('John', 'White'), ('2', '12130'), ('11', '32410'), ('15', '4520')] 
1
with open("input.txt", "r") as inp, open("output.txt", "w") as out: 
     data = inp.readlines() 
     for i in xrange(0, len(data), 4): 
      name = data[i].strip() 
      maxi = 0 
      true_code = 0 
      for item in data[i+1: i+4]: 
       code, bal = item.strip().split(" ") 
       code, bal = int(code), int(bal) 
       if bal >= maxi: 
        maxi = bal 
        true_code = code 
      out.write("%s %s" %(name, true_code)) 
+0

이렇게하면 "압축을 풀려면 1 개 이상의 값이 필요합니다"라는 오류가 발생하지만 감사합니다. – user1966576

+0

코드와 잔액 사이에 둘 이상의 공백 문자가있을 수 있습니다. 11_1230 대신 11__1230 – Zangetsu

관련 문제