2011-01-30 6 views
0

다음과 같은 파일이 있습니다. 원하는 것은 전압뿐입니다. 다른 모든 것을 제거하는 가장 쉬운 방법은 무엇입니까?파이썬 문자열 조작

Time,Voltage,Peak 
0.0,1.003911558621642,3 
0.00390625,1.0327467181982755,0 
0.0078125,0.9904463156237306,0 
0.01171875,0.6867661682528724,0 
0.015625,0.6236803073669519,0 
0.01953125,0.2934711210503298,0 
0.0234375,0.06148933838536881,0 
0.02734375,0.07053968550834916,0 
0.03125,-0.09041720958299812,0 
0.03515625,-0.28273374252040306,0 
0.0390625,-0.29775398016603216,0 
+0

는 전압합니까 무엇을 원하는가? 값을 반복하다? 목록 가져와? – tokland

답변

4
with open("input.txt") as f: 
    for s in f: 
     print(s.split(",")[1]) 
+0

-1 (나는 downvoted하고 upvoted 때문에 이미 그럴 수 없다.) :이 솔루션은 제목 줄을 건너 뛰지 않고 전압을 부동 소수점으로 변환하지 않는다. – 6502

+0

@ 6502 : 왜 float로 변환하겠습니까? 그 질문에 대해서는 아무 것도 없습니다. – viraptor

+0

@viraptor : 나는 원래 포스터가 "내가 원하는 것은 모두 전압이다."라고 썼고, "모두 내가 원하는 것은 두번째 칼럼"도 아니고 "나는 모두 전압 필드를 원한다"라고 쓰지 않았다. 따라서 IMO에서 "전압"제목은 필요하지 않으며 전압을 나타 내기위한 합리적인 데이터 유형 (예 : 그래프 만들기)은 부동입니다. 물론 당신이 옳을 수도 있고 완전히 틀렸을 수도 있습니다. 그러나 여기서 볼 수있는 것은 Mattew의 효과 (http://goo.gl/O4kFJ)의 또 다른 사례입니다. 즉 126k가 말한 것은 " 더 정확한 "상관없이. – 6502

4

이 첫 번째 줄을 건너 뛰고 두 번째 열에서 수레의 목록을 반환합니다

def get_second_col_floats(file_name): 
    with open(file_name) as f: 
     f.next() # skip the first line 
     return [float(line.split(',')[1]) for line in f] 

편집 : 당신은 또한 당신이 필요로 끝날 경우 아웃 Python CSV module을 확인 할 수 있습니다 더 진보 된 일을하는 것. 표준 라이브러리의 일부이므로 더 많은 종속성을 추가하지 않습니다.

8

이 소리는이 부동의 목록으로 전압을 반환합니다 the csv module

import csv 
with open("input.txt", "rb") as f: 
    reader = csv.reader(f) 
    next(reader) 
    for i in reader: 
     print float(i[1]) 
3

에 작업이

voltage = [float(x.split(",")[1]) 
      for x in open("input.txt").readlines()[1:]] 

값이 컴팩트 한 많은 파이썬 기능을 활용

  1. open("input.txt").readlines()은 전체 공동 작업자를 반환하는 단일 표현식입니다. 각 요소가 파일의 한 줄인 목록으로 된 파일. 전체 파일을 목록에 넣는 것은 파일 크기가 거대하고 (수 메가 바이트) 파일을 명시 적으로 한 줄씩 처리하지 않는 한 파일 내용을 처리하는 합리적인 방법입니다.

  2. x[1:]x에서 첫 번째 요소가 제거 그러나와 동일한 새로운 목록을 반환 x 목록이 제공 파이썬 "슬라이스"식이다. 귀하의 경우에는 제목 줄을 삭제하는 데 사용됩니다.

    일반적인 형식은 x[begin:end:step]이며 많은 유용한 방법으로 목록에서 데이터를 추출 할 수 있습니다. 짝수 인덱스가있는 x의 모든 요소 목록은 단지 x[::2]이거나 x의 마지막 10 개 요소 목록은 x[-10:]입니다.

  3. x.split(",") 지정된 구분자 ","에서 절단하여 문자열의 배열로서 x 문자열의 내용을 반환한다. 따라서 조합 된 표현 x.split(",")[1]을 사용하면 파일의 행에서 두 번째 값을 추출 할 수 있습니다.

  4. [expr(x) for x in L]은 "list comprehension"표현식으로 표기되고 L에있는 각 항목에 대해 expr(x)을 평가 한 결과 목록을 반환합니다.

그들 모두 결합 된 이러한 기능은 코드의 단지 하나의 라인에서 문제를 해결할 수 있으며 문제는이 같은 작은 문제에 대한 확인을하는 동안은 그러나 극단적으로 밀어해서는 안 뭔가를 (의 golf ;-))

1

모듈과 목록 이해를 결합하여 모든 부동 소수점 전압 값을 추가 처리를 위해 목록에 저장할 수 있습니다. 이 목록은 with 문 컨텍스트에서 만들어지며 오류가 발생하더라도 이후에 파일을 자동으로 처리합니다.

파일의 데이터는 한 번에 한 줄씩 읽음으로써 처리되므로 크기 파일과 상관없이 목록을 구성하는 동안 메모리 사용을 최소화합니다. 이 값을 확장하여 다른 값을 처리하고 목록에 저장하거나, 사전과 같은 다른 유형의 데이터 구조를 저장하는 것은 매우 쉽습니다.

import csv 
with open("data.txt", "rb") as csvfile: 
    voltages = [float(row['Voltage']) for row in csv.DictReader(csvfile)] 

print 'voltages:', voltages 

출력 :

voltages: [1.003911558621642, 1.0327467181982755, 0.9904463156237306, 0.6867661682528724, 0.6236803073669519, 0.2934711210503298, 0.06148933838536881, 0.07053968550834916, -0.09041720958299812, -0.28273374252040306, -0.29775398016603216]