如何使用Python读取文本文件中的某一行?

时间:2015-12-07 23:11:46

标签: python loops for-loop iteration

我有一个文本文件,其位置及其坐标位于新行上,例如

A&AB
42.289567
-83.717143
AH
42.276620
-83.739620)

我有一个for循环遍历此列表,如果该位置与用户输入匹配,则返回接下来的两行(纬度和经度)。如何使用Python以简洁的方式完成此操作?我知道如何用C ++做这个,但我不知道用Python。

6 个答案:

答案 0 :(得分:1)

Python迭代器可以手动升级,也可以隐式升级。假设您只读一个值,而不是反复检查(并且不想因为某种原因将所有值存储在内存中),您可以这样做:

def find_latlong(locname, locfile):
    with open(locfile) as f:
        for line in f:
            if line.rstrip() == locname:
                try:
                    return float(next(f)), float(next(f))
                except StopIteration:
                    break
    raise ValueError("location {!r} not found".format(locname))

这只是在提供的文件中查找与提供的名称匹配的行,并在找到它时手动迭代以获得接下来的两行。

另一种假设确切的三行模式,并且不检查非名称行:

from future_builtins import map, zip  # Only on Python 2

def find_latlong(locname, locfile):
    with open(locfile) as f:
        f = map(str.rstrip, f)
        for header, lat, lng in zip(f, f, f):  # Reads three lines at a time
            if header == locname:
                return float(lat), float(lng)
    raise ValueError("location {!r} not found".format(locname))

答案 1 :(得分:1)

这是同一种汤的另一种方法:

def match(name):
    with open("locat.txt") as f:
        #gr = [iter(f)]*3
        #for tag lat, lon in zip(*gr):
        for tag, lat, lon in zip(f, f, f):
            if tag.rstrip() == name:
                return float(lat.rstrip('\n)')), float(lon.rstrip('\n)'))
    return None

print(match('AY'))
print(match('xy'))

产生

(42.27, -83.73)
None

它只会尝试将给定名称与每个第三行匹配,如果找不到匹配则返回None

注意:没有错误检查,因此您需要确保输入数据是正确的(例如,如果任何条目缺少一行,即一个坐标值,它将无法工作。在这种情况下,另一个上面的答案检查每行的匹配将更好地工作并自动重新同步。

答案 2 :(得分:1)

from itertools import dropwhile
def get_data(fle, lne):
    with open(fle) as f:
        dw = dropwhile(lambda x: x.rstrip() != lne,f)
        _, a, b = next(dw,""), next(dw, "").rstrip(")\n"), next(dw,"").rstrip(")")
        return  (a,b) if b else (None, None)

lat, lon = get_data("foo.txt","A&AB")
if lat:
   # you have a match 

答案 3 :(得分:-1)

查看这个答案,了解一些很棒的选择 点击here。 最简单的答案是您可以使用in运算符或matches = [x for x in lst if fulfills_some_condition(x)]。但请点击上面的链接获取更详细的答案。当然,假设您正在按照描述迭代列表。

答案 4 :(得分:-1)

作为一种语言,Python强调可读性。除了使用其他人提供的迭代器的高级解决方案之外,还有一个在文件对象上使用简单readline方法:

with open(filename) as f:
    while True:
        desc =f.readline()
        lat = f.readline()
        lng = f.readline()
        if not desc:
            return None, None
        if desc.strip() == wanted:
            return float(lat), float(lng)

答案 5 :(得分:-2)

我认为你可以做的是建立一个元组列表,其中每个元组都是类型(位置,纬度,经度)

您可以按照以下方式执行此操作:

class ApplicationController < ActionController::Base

  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:street_number, :email, :password, :password_confirmation, :remember_me, :avatar) }
    devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:login, :email, :password, :remember_me) }
    devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:street_number, :email, :password, :password_confirmation, :current_password) }
  end

end