2017-03-31 3 views
0

저는 BGE의 작은 프로젝트에서 data.txt를 data.csv 파일로 가져 와서 데이터를 2 개의 열로 나눕니다.블렌더 게임 엔진에서 CSV 데이터를 파이썬으로 나누기

내 data.txt는 다음과 같습니다.

Breathing rate:, 1.0 
Pulse:, 140 
Spinal Injury:, Yes 

당신이 추측 하듯이 ","을 열의 구분 기호로 사용하고 싶습니다.

그리고 여기에 현재 코드가 있습니다.

try: 
    file = open(path+"dialogue.txt", 'r') 
    info = file.readlines() 
    own.text = str(info[currentLineNumber]) 
except: 
    own.text = "end of script" 

column1 = [] 
column2 = [] 
if own ["currentLine"] == 10: 
    own.sendMessage("resume") 
    with open(path+"data.txt", 'r') as in_file: 
     stripped = (line.strip() for line in in_file) 
     datalines = (line.split(",") for line in stripped if line) 
     with open(path+"data.csv", 'w') as out_file: 
      writer = csv.writer(out_file) 
      writer.writerow(('subject', 'value')) 
      writer.writerow(('ID: ', (uuid.uuid1()))) 
      writer.writerows(datalines) 
os.rename(path+"data.csv", path+"newData.csv") 
with open('newData.csv', 'r') as f: 
    reader = csv.reader(f, delimiter=',') 
    for row in reader: 
     column1.append(row[0]) 
     column2.append(row[1]) 

내가 data.csv로 데이터를 가져올 수 있지만 내가 열로 데이터를 분리 할 수없는 하나의 열에있는 모든 가져온 데이터. 이 문제를 어떻게 해결할 수 있습니까?

+1

그냥 파일을 직접 읽어 보셨습니까 'csv.reader' 객체로 CSV로 변환합니까? 데이터가 이미 쉼표로 분리 된 형식 인 것 같습니다. 하위 섹션 만 원할 경우 StringIO로 펌핑하여 읽을 수 있습니다. – theodox

+0

저는 초보자이므로 csv.reader 객체로 직접 파일을 읽는 것에 대해 잘 모릅니다. 나는 내 "reader = csv.reader (f, delimiter = ',')"가 csv 리더라고 생각했습니다. – ricster

+0

data.txt 샘플은 쉼표로 구분되어 있습니다. data.txt를 읽고 수동으로 쉼표로 분리하여 csv로 저장하면 다시 읽을 수 있습니다. 파일의 시작 부분에 ID 행을 추가하면됩니다. Data.txt에서 여러 줄을 가져 와서 각 줄의 두 번째 열을 data.csv의 열에 넣으면됩니다. var1, var2, var3에 3 행을 입력 한 다음 'writerow (ID, var1 [1], var2 [1], var3 [1])'로 읽습니다. – sambler

답변

1

귀하의 예제의 형식이 일치 적어도 경우, 당신은이 작업을 수행 할 수 있습니다

[['Breathing rate:', ' 1.0'], ['Pulse:', ' 140'], ['Spinal Injury:', ' Yes']] 
:

datafile = "path/to/textfile" 
with open (datafile, 'rt') as filehandle: 
    csv_reader = csv.reader(filehandle, delimiter = ',') 
    data = [row for row in csv_reader] 

이이 같은리스트의-목록으로 쉼표로 구분 된 쌍을 수집합니다

원하는 데이터가 큰 파일의 하위 집합 인 경우 stringIO 개체로 복사하여이를 csv 판독기에 전달할 수 있습니다. 그것은 독자에게 디스크 파일처럼 보일 것입니다. 다음은 간단한 예제 :

import StringIO 
filtered_data = StringIO.StringIO() 
with open(datafile, 'rt') as originalfile: 
    for line in originalfile: 
     if ":," in line: # your real criteria would go here... 
      filtered_data.write(line.strip() + "\n") 

# rewind to beginning of your stringIO 
filtered_data.seek(0) 
csv_reader = csv.reader(filtered_data, delimiter = ',') 
data = [row for row in csv_reader] 

난 그냥 추측 무엇 실제로 좋은 라인을 찾기위한 기준 - 당신은 쉼표로 구분 된 라인을 선택하는 데 필요한 논리를 사용할 수

+0

재미있는 일이 일어났습니다. 첫 번째 제안 (Blender는 StringIO를 지원하지 않음)을 따라 코드를 다시 실행합니다. CSV 파일의 미리보기가 변경되었습니다. http://i.imgur.com/jXhhFVC.png하지만 파일을 열었을 때 모든 데이터는 단일 열에있었습니다. http://i.imgur.com/oVKxdvD.png – ricster

+0

오, 잘 CSV 파일을 보는 Excel 관련 잘 알려진 문제였던 것 같습니다. 귀하의 제안은 완벽하게 작동했습니다. 감사합니다. – ricster

관련 문제