يمكن أن يزيل Python اقتباسات مزدوجة من سلسلة، عند القراءة في ملف نصي؟

StackOverflow https://stackoverflow.com/questions/1707558

سؤال

لدي بعض الملفات النصية مثل هذا، مع عدة خطوط 5000:

5.6  4.5  6.8  "6.5" (new line)
5.4  8.3  1.2  "9.3" (new line)

لذا فإن الفصل الأخير هو رقم بين الاقتباسات المزدوجة.

ما أريد القيام به هو، باستخدام Python (إن أمكن)، لتعيين الأعمدة الأربعة لمتغيرات مزدوجة. لكن المشكلة الرئيسية هي الفصل الأخير، لم أجد أي طريقة لإزالة الاقتباسات المزدوجة على الرقم، هل من الممكن في Linux؟

هذا ما حاولت:

#!/usr/bin/python

import os,sys,re,string,array

name=sys.argv[1]
infile = open(name,"r")

cont = 0
while 1:
         line = infile.readline()
         if not line: break
         l = re.split("\s+",string.strip(line)).replace('\"','')
     cont = cont +1
     a = l[0]
     b = l[1]
     c = l[2]
     d = l[3]
هل كانت مفيدة؟

المحلول

ال csv الوحدة النمطية (المكتبة القياسية) هل تقوم تلقائيا، على الرغم من أن المستندات غير محددة للغاية skipinitialspace

>>> import csv

>>> with open(name, 'rb') as f:
...     for row in csv.reader(f, delimiter=' ', skipinitialspace=True):
...             print '|'.join(row)

5.6|4.5|6.8|6.5
5.4|8.3|1.2|9.3

نصائح أخرى

for line in open(name, "r"):
    line = line.replace('"', '').strip()
    a, b, c, d = map(float, line.split())

هذا هو نوع من العظام العارية، وسوف تثير الاستثناءات إذا كان هناك (على سبيل المثال) لا توجد أربع قيم على الخط، إلخ.

هناك وحدة نمطية يمكنك استخدامها من مكتبة قياسية تسمى shlex:

>>> import shlex
>>> print shlex.split('5.6  4.5  6.8  "6.5"')
['5.6', '4.5', '6.8', '6.5']
for line in open(fname):
    line = line.split()
    line[-1] = line[-1].strip('"\n')
    floats = [float(i) for i in line]

خيار آخر هو استخدام الوحدة النمطية المدمجة، وهذا هو منوي لهذه المهمة. يسمى csv:

>>> import csv
>>> for line in csv.reader(open(fname), delimiter=' '):
    print([float(i) for i in line])

[5.6, 4.5, 6.8, 6.5]
[5.6, 4.5, 6.8, 6.5]

أو يمكنك ببساطة استبدال خطك

l = re.split("\s+",string.strip(line)).replace('\"','')

مع هذا:

l = re.split('[\s"]+',string.strip(line))

اعتدت في جوهرها إزالة "في" 25 "باستخدام

Code:
        result = result.strip("\"") #remove double quotes characters 

أعتقد أن أسهل وأكثر الأشياء فعالية يجب أن تفعل ذلك هو شريحة ذلك!

من التعليمات البرمجية الخاصة بك:

d = l[3]
returns "6.5"

لذلك يمكنك ببساطة إضافة بيان آخر:

d = d[1:-1]

الآن سيعود 6.5 دون اقتباسات رائدة ونهاية مزدوجة.

فيولا! :)

يمكنك استخدام Regexp، جرب شيئا مثل هذا

import re
re.findall("[0-9.]+", file(name).read())

سيعطيك هذا قائمة بجميع الأرقام في ملفك كسلاسل دون أي اقتباسات.

IMHO، أكثر stripper العالمي لا دوري هو هذا:

In [1]: s = '1 " 1 2" 0 a "3 4 5 " 6'
In [2]: [i[0].strip() for i in csv.reader(s, delimiter=' ') if i != ['', '']]
Out[2]: ['1', '1 2', '0', 'a', '3 4 5', '6']
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top