这是我的第一个问题!
我有一个包含数百行的文件,例如:
<car> <part_of> <machine>
<motor> <part_of> <car>
每一行代表主题,关系,对象
我想分别读取每两行,处理它们,然后根据输入文件输出2行或3行。 我做了这样的事情:
opener = open('input.txt') # to read even lines
opener2 = open('input.txt') # to read odd lines
num = 2
for eachline in opener:
if num % 2 == 0:
line1 = opener.readline().split()
sub_line1, rel_line1, obj_line1 = line1[0],line1[1],line1[2]
sub_line1 = line1[0].lstrip("<").rstrip(">")
rel_line1 = line1[1].lstrip("<").rstrip(">")
obj_line1 = line1[2].lstrip("\"").rstrip("\"")
else:
line2 = opener2.readline().split()
sub_line2, rel_line2, obj_line2 = line1[0],line2[1],line2[2]
sub_line2 = line2[0].lstrip("<").rstrip(">")
rel_line2 = line2[1].lstrip("<").rstrip(">")
obj_line2 = line2[2].lstrip("\"").rstrip("\"")
num += 1
我为输出做了这个:
output1 = " ".join([sub_line1,rel_line1,obj_line1])
writer.write(output1+"\n")
output2 = " ".join([sub_line2,rel_line2,obj_line2])
writer.write(output2+'\n')
output3 = " ".join([sub_line1,relation,sub_line2])
writer.write(output3+'\n')
注意:输入中不存在output3。我通过组合前两行来添加它。但每次奇数线被偶数重写。我该如何分开它们?
示例输出:
<car> <part_of> <machine>
<motor> <part_of> <car>
<car> <part_of> <motor>
每个第3行基于前2行组成。
第2部分:
如果输入文件中有一行,以“_”开头,我怎么能按原样输出它而不将其作为我正在处理的2行之一?我在哪里可以说这个条件?
提前致谢!!
答案 0 :(得分:2)
您无法获取文件描述符(open
返回的内容)只能读取奇数行或偶数行。
它必须读取文件 1 的全部内容。
但是,因此,您不需要拥有两个文件描述符:只能使用一个文件描述符。
您可以迭代enumerate(file)
而不是file
。
它不会给你提供线条,而是会给你(index, line)
对夫妻。
您可以通过for id, line in enumerate(file)
解压缩此问题,然后按id
检查2
的剩余部分,以确定它是奇数还是偶数。
file = open(path, 'r')
for id, line in enumerate(file):
if id % 2 == 0:
# The line is even
else:
# The line is odd
1 公平地说,可以获取一个文件描述符,只读取奇数或偶数行,因为你可以跳过其他所有行...但是,当一个人已经完成这项工作时,为什么还要创建两个描述符呢?
答案 1 :(得分:1)
目前尚不清楚为什么需要分离迭代器;一次只读两行:
with open('input.txt') as fh:
while True:
line1 = fh.readline()
line2 = fh.readline()
if not line1:
break
...
如果 但是,如果做由于某种原因需要单独的迭代器,请让每个迭代器负责跳过所有其他行。使用line1
和line2
itertools
和from itertools import tee, islice, izip
with open('input.txt') as fh:
# Get two copies of the iterator. IMPORTANT: don't use fh
# anymore; only itr1 and itr2
itr1, itr2 = tee(fh)
itr1 = islice(itr1, 0, None, 2) # 0, 2, 4, ...
itr2 = islice(itr2, 1, None, 2) # 1, 3, 5, ...
for line1, line2 in izip(itr1, itr2):
...
为空,则可以修改中断条件,例如文件的行数为奇数。 / p>
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/fragment_container"
android:name="android.app.DialogFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.chetan.fragmentprtc.MainActivity"
/>
模块可以轻松实现:package com.example.chetan.fragmentprtc;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentTransaction transaction =
getFragmentManager().beginTransaction();
BlankFragment fragment = new BlankFragment();
transaction.replace(R.id.fragment_container, fragment);
transaction.addToBackStack(null);
transaction.commit();
}
}