python TXT文档的读写(附有 在txt文档起始位置插入功能)

使用的 Python open() 函数

基础写入操作:

python open() 函数用于打开一个文件,创建一个 file 对象,相关的方法才可以调用它进行读写。

such as:
 with open(filepath, “r”) as file
 with open(filepath, “r+”) as file
 with open(filepath, “w”) as file

python打开txt并输出 python打开txt文档_数据


1、首先一般的读写操作:

读:
    with open(filepath, "r") as file:
        for line in file:
        	nums = line.split(';')

写:
	with open('data.txt','w') as f:    #txt不存在,会自动创建
	     f.write(str)                 #将字符串写入文件中

可读可写:
# 当不使用with open语句时,需要f.close来关闭文档
f = open(path_txt_save, 'w+') # 读写
f.truncate()  #清楚所有内容
f.close()

2、因为在 txt写入时,默认的是将新的内容插入到 尾部,要是想将内容插入到 头部起始位置,
进行如下操作:
将 a.txt文件读取,经过一定操作,写入b.txt

with open('a.txt', "r+") as f:
     old = f.read()  # 先读取内容保存一份
     f.seek(0)  # 将光标定位到起始位置
     f.write(data)  # 写入新的数据,现在写入时,会清除覆盖掉原有数据
     f.write(old)  #写入之前数据,这次在写入数据时,不会再清除原有数据,而是在尾部添加

3、example
将以下数据写入a.txt,新建a.txt。然后将 a.txt文档中,数据重新写入 b.txt文档,
要求:最后字符串为“8XXX”的行,都写入b.txt文档的头部;最后字符串为“800Y”的行,过滤掉,不写入b.txt

0;2806;1068;2765;1080;2782;1082;2812;1072;2820;1071;2845;1072;2846;1069;2815;1068;80XX;
0;3262;1153;3322;1172;3355;1179;3389;1190;3435;1198;3501;1214;3611;1238;3712;1259;4093;1342;4093;1333;3827;1278;3668;1243;3579;1226;3490;1206;3457;1199;3413;1190;3388;1184;3372;1176;3263;1148;800Y;
0;2872;1385;3178;1614;3201;1623;3302;1622;3924;1936;4092;1948;4092;1931;3408;1614;3459;1609;3462;1604;3451;1597;3425;1588;80XX;
0;2142;1024;2136;1033;2135;1042;2140;1051;2152;1071;2169;1091;2216;1143;2298;1221;2767;1649;2834;1655;2486;1362;2321;1218;2227;1134;2190;1099;2164;1070;2146;1048;2143;1034;2146;1025;800Y;
0;2506;1128;2704;1200;3081;1334;3482;1472;4093;1680;4093;1660;3480;1455;2994;1291;2638;1168;2511;1123;800Y;
0;2;1429;595;1293;1239;1142;1470;1089;1469;1084;1466;1084;1462;1077;1033;1167;439;1292;3;1383;800Y;
0;1;1417;1465;1084;1470;1093;1470;1104;1479;1106;1496;1106;1503;1088;1602;1093;1608;1106;1628;1106;1633;1086;1655;1077;1657;1091;1678;1088;1684;1066;1682;1041;1716;1030;1713;1055;1716;1082;1713;1106;1718;1117;1745;1120;1749;1106;1874;1108;1883;1124;1901;1124;1903;1099;1915;1099;1928;1099;1930;1039;1919;1026;1930;1021;1930;1008;1917;1008;1912;1015;1903;994;1986;992;1984;1006;1984;1073;2004;1075;2008;1064;2091;1064;2098;1075;2123;1077;2123;1001;2143;988;2147;1028;2172;1028;2176;1015;2221;1015;2228;1032;2225;1057;2228;1102;2246;1104;2252;1104;2257;1122;2277;1122;2286;1108;2391;1104;2400;1124;2418;1122;2424;1099;2427;1066;2565;1066;2599;1057;2626;1053;2655;1050;2717;1046;2805;1039;2858;1037;2849;1053;2843;1077;2843;1113;2847;1153;2847;1155;2851;1162;2885;1160;2889;1146;2934;1162;2939;1180;2945;1196;2952;1200;2981;1200;3010;1205;3037;1171;3167;1178;3169;1187;3176;1202;3187;1209;3220;1209;3234;1200;3243;1169;3258;1164;3270;1146;3270;1135;3415;1178;3851;1276;4090;1323;4090;1947;3983;1940;3835;1925;3750;1896;3583;1833;3381;1764;3254;1721;3149;1692;3028;1672;2925;1665;2827;1654;2585;1638;2538;1629;2391;1634;2371;1634;2330;1647;2266;1650;2143;1663;2078;1674;2031;1679;1979;1688;1924;1703;1859;1741;1812;1766;1771;1784;1740;1813;1689;1878;1646;1931;1597;1996;1559;2088;1541;2162;3;2164;8XXX;

上述最后一行有回车。

代码:

import os
# filepath = "C:/Users/xujun/Desktop/front_img/002_012003_120449001.txt"
# outpath = "C:/Users/xujun/Desktop/front_img/bbb.txt"

input = 'C:/Users/xujun/Desktop/front_img/annotations'
output = 'C:/Users/xujun/Desktop/front_img/annotations_sort'
num = 1
for filename in os.listdir(input):
    filepath = os.path.join(input,filename)   #输入文件
    outpath = os.path.join(output,filename)   #输出文件
    print ('filepath: ', filepath, num)
    print ('outpath: ', outpath, num)
    print ('*******************************************')
    with open(filepath, "r") as file1:   #打开读取文件
        for line in file1:
            if not os.path.exists(outpath):
                open(outpath,'w')
            with open(outpath, "r+") as file2:
                content = file2.read()
                nums = line.split(';')
                if nums[-2] == '8XXX' :  # 写入txt头部操作
                    file2.seek(0)
                    file2.write(line)
                    file2.write(content)
                elif nums[-2] == '800Y':  # 过滤操作
                    continue
                else:
                    file2.write(line)

    num += 1

4、example
将以下数据写入a.txt,新建a.txt。然后将 a.txt文档中,数据重新写入 b.txt文档。
写入要求:
最后字符串为“8XXX”的行,都写入b.txt文档的头部;
最后字符串为“800Y”的行:
进行判断,如果800Y区域和800X区域有重合,则舍去;如何没有重合则将其写入b.txt
,过滤掉,不写入b.txt。

其他的行直接读取写入b.txt。

新建a.txt文档,将一下内容copy进a.txt。

0;2806;1068;2765;1080;2782;1082;2812;1072;2820;1071;2845;1072;2846;1069;2815;1068;80XX;
0;3262;1153;3322;1172;3355;1179;3389;1190;3435;1198;3501;1214;3611;1238;3712;1259;4093;1342;4093;1333;3827;1278;3668;1243;3579;1226;3490;1206;3457;1199;3413;1190;3388;1184;3372;1176;3263;1148;800Y;
0;2872;1385;3178;1614;3201;1623;3302;1622;3924;1936;4092;1948;4092;1931;3408;1614;3459;1609;3462;1604;3451;1597;3425;1588;80XX;
0;2110;1395;2011;1627;2128;1630;2134;1639;2139;1665;2263;1653;2254;1628;2315;1628;2333;1627;2343;1623;2344;1611;2132;1394;2123;1392;80XX;
0;871;1516;618;1728;641;1726;882;1594;930;1631;960;1670;988;1706;1004;1730;439;2165;671;2164;1323;1581;1122;1459;1241;1384;1109;1430;905;1502;80XX;
0;0;1485;528;1373;296;1442;305;1447;283;1455;254;1534;274;1545;252;1558;0;1648;80XX;
0;2142;1024;2136;1033;2135;1042;2140;1051;2152;1071;2169;1091;2216;1143;2298;1221;2767;1649;2834;1655;2486;1362;2321;1218;2227;1134;2190;1099;2164;1070;2146;1048;2143;1034;2146;1025;800Y;
0;1204;2166;1537;1658;1748;1335;1841;1206;1888;1139;1909;1114;1922;1101;1927;1100;1930;1091;1948;1071;1966;1057;1983;1043;1983;1050;1971;1061;1947;1086;1924;1115;1891;1162;1840;1248;1770;1364;1682;1515;1323;2163;800Y;
0;1715;1050;1707;1050;1683;1053;1683;1058;1714;1061;1684;1071;1708;1070;1715;1069;1715;1063;1715;1057;1715;1054;1705;1053;80XX;
0;1942;1027;1938;1022;1958;1021;1956;1023;1984;1024;1984;1030;1974;1033;1964;1033;1975;1028;1975;1027;1956;1026;1948;1025;80XX;
0;0;1738;707;1468;1239;1260;1561;1137;1715;1082;1715;1088;1489;1173;1069;1340;340;1635;0;1768;800Y;
0;2855;1038;2830;1039;2739;1046;2815;1050;2855;1046;2857;1044;2860;1039;8025;
0;2424;1055;2446;1055;2474;1056;2522;1056;2549;1056;2577;1052;2584;1053;2587;1057;2577;1059;2568;1061;2566;1064;2548;1064;2525;1065;2498;1065;2466;1065;2447;1065;2428;1065;8040;
0;2613;1048;2637;1046;2664;1044;2691;1041;2709;1040;2723;1039;2724;1045;2700;1047;2672;1050;2644;1052;2623;1054;2613;1055;2609;1048;8040;
0;2425;1102;2486;1122;2499;1126;2511;1123;2503;1116;2504;1102;2513;1090;2525;1083;2538;1076;2525;1076;2510;1078;2482;1080;2463;1081;2442;1082;2425;1079;801X;
0;2550;1075;2571;1069;2597;1066;2615;1063;2634;1061;2657;1058;2677;1055;2696;1052;2685;1051;2671;1053;2651;1055;2630;1058;2612;1060;2592;1063;2569;1067;2553;1069;2538;1073;800X;
0;2698;1052;2850;1058;2849;1056;2701;1050;8026;
0;1628;981;1740;976;1751;976;1750;991;1741;1004;1735;1014;1734;1019;1727;1022;1722;1027;1718;1033;1700;1038;1683;1040;1680;1030;1673;1024;1677;1019;1676;1014;1674;1011;1665;1010;1664;1016;1662;1016;1654;1003;1645;992;1637;986;1630;983;8043;
0;3;1077;824;1028;1504;987;1486;1004;1479;1012;1472;1017;1467;1021;1463;1033;1462;1049;1462;1064;1464;1076;1465;1082;1411;1098;1284;1124;533;1298;0;1415;8043;
0;256;1040;289;1025;353;1025;351;1036;341;1041;8025;
0;2;1429;625;1287;1147;1165;1471;1089;1469;1085;1164;1154;723;1256;0;1418;800X;
0;2506;1128;2704;1200;3081;1334;3482;1472;4093;1680;4093;1660;3480;1455;2994;1291;2638;1168;2511;1123;800Y;
0;2;1429;595;1293;1239;1142;1470;1089;1469;1084;1466;1084;1462;1077;1033;1167;439;1292;3;1383;800Y;
0;1;1417;1465;1084;1470;1093;1470;1104;1479;1106;1496;1106;1503;1088;1602;1093;1608;1106;1628;1106;1633;1086;1655;1077;1657;1091;1678;1088;1684;1066;1682;1041;1716;1030;1713;1055;1716;1082;1713;1106;1718;1117;1745;1120;1749;1106;1874;1108;1883;1124;1901;1124;1903;1099;1915;1099;1928;1099;1930;1039;1919;1026;1930;1021;1930;1008;1917;1008;1912;1015;1903;994;1986;992;1984;1006;1984;1073;2004;1075;2008;1064;2091;1064;2098;1075;2123;1077;2123;1001;2143;988;2147;1028;2172;1028;2176;1015;2221;1015;2228;1032;2225;1057;2228;1102;2246;1104;2252;1104;2257;1122;2277;1122;2286;1108;2391;1104;2400;1124;2418;1122;2424;1099;2427;1066;2565;1066;2599;1057;2626;1053;2655;1050;2717;1046;2805;1039;2858;1037;2849;1053;2843;1077;2843;1113;2847;1153;2847;1155;2851;1162;2885;1160;2889;1146;2934;1162;2939;1180;2945;1196;2952;1200;2981;1200;3010;1205;3037;1171;3167;1178;3169;1187;3176;1202;3187;1209;3220;1209;3234;1200;3243;1169;3258;1164;3270;1146;3270;1135;3415;1178;3851;1276;4090;1323;4090;1947;3983;1940;3835;1925;3750;1896;3583;1833;3381;1764;3254;1721;3149;1692;3028;1672;2925;1665;2827;1654;2585;1638;2538;1629;2391;1634;2371;1634;2330;1647;2266;1650;2143;1663;2078;1674;2031;1679;1979;1688;1924;1703;1859;1741;1812;1766;1771;1784;1740;1813;1689;1878;1646;1931;1597;1996;1559;2088;1541;2162;3;2164;8XXX;

code ------ 单张测试

import os
import numpy as np
filepath = "C:/Users/xujun/Desktop/front_img/002_003003_102837851.txt"
outpath = "C:/Users/xujun/Desktop/front_img/bbb.txt"

# 判断一个点是否在一个多边形区域内(射线法),如果在则返回值为True,如果不在则返回值为 False
def isRayIntersectsSegment(poi,s_poi,e_poi): #[x,y] [lng,lat]
    #输入:判断点,边起点,边终点,都是[lng,lat]格式数组
    if s_poi[1]==e_poi[1]: #排除与射线平行、重合,线段首尾端点重合的情况
        return False
    if s_poi[1]>poi[1] and e_poi[1]>poi[1]: #线段在射线上边
        return False
    if s_poi[1]<poi[1] and e_poi[1]<poi[1]: #线段在射线下边
        return False
    if s_poi[1]==poi[1] and e_poi[1]>poi[1]: #交点为下端点,对应spoint
        return False
    if e_poi[1]==poi[1] and s_poi[1]>poi[1]: #交点为下端点,对应epoint
        return False
    if s_poi[0]<poi[0] and e_poi[1]<poi[1]: #线段在射线左边
        return False

    xseg=e_poi[0]-(e_poi[0]-s_poi[0])*(e_poi[1]-poi[1])/(e_poi[1]-s_poi[1]) #求交
    if xseg<poi[0]: #交点在射线起点的左侧
        return False
    return True  #排除上述情况之后

# 判断一个点是否在一个多边形区域内(射线法),如果在则返回值为True,如果不在则返回值为 False
def isPoiWithinPoly(poi,poly):
    #输入:点,多边形三维数组
    #poly=[[[x1,y1],[x2,y2],……,[xn,yn],[x1,y1]],[[w1,t1],……[wk,tk]]] 三维数组

    #可以先判断点是否在外包矩形内
    #if not isPoiWithinBox(poi,mbr=[[0,0],[180,90]]): return False
    #但算最小外包矩形本身需要循环边,会造成开销,本处略去
    sinsc=0 #交点个数
    for epoly in poly: #循环每条边的曲线->each polygon 是二维数组[[x1,y1],…[xn,yn]]
        for i in range(len(epoly)-1): #[0,len-1]
            s_poi=epoly[i]
            e_poi=epoly[i+1]
            if isRayIntersectsSegment(poi,s_poi,e_poi):
                sinsc+=1 #有交点就加1

    return True if sinsc%2==1 else  False

def find_800x_contours(filepath):
    contours_800x = []
    with open(filepath, "r") as file1:  # 打开读取文件
        for line in file1:
            nums = line.split(';')
            vertices = np.asarray(nums[1:-2], dtype=int)
            nvertices = len(vertices) / 2
            assert np.mod(nvertices, 1) == 0
            vertices = vertices.reshape(int(nvertices), 2)
            if nums[-2] == '800X':
                contours_800x.append(vertices)
    return contours_800x

contours_800x = find_800x_contours(filepath)

with open(filepath, "r") as file1:   #打开读取文件
    for line in file1:
        if not os.path.exists(outpath):
            open(outpath,'w')
        with open(outpath, "r+") as file2:
            content = file2.read()
            nums = line.split(';')

            if nums[-2] == '8XXX' :  # 写入txt头部操作
                file2.seek(0)
                file2.write(line)
                file2.write(content)
            elif nums[-2] == '800Y':  # 过滤操作
                vertices = np.asarray(nums[1:-2], dtype=int)
                nvertices = len(vertices) / 2
                assert np.mod(nvertices, 1) == 0
                vertices = vertices.reshape(int(nvertices), 2)
                # print ('#################################')
                sign = False   #设置 标记
                for point in vertices:   # 遍历所有的点,如果有一个点在区域内,则 tick=True,最后 sign就会被置 1
                    tick = isPoiWithinPoly(point,contours_800x)
                    sign = sign or tick
                if sign == False:
                    file2.write(line)
                else:
                    continue
            else:
                file2.write(line)

# print (a,'\n',type(a))

5、example
将以下数据写入a.txt,新建a.txt。然后将 a.txt文档中,数据重新写入 b.txt文档。
写入要求:
最后字符串为“8XXX”的行,都写入b.txt文档的头部;
最后字符串为“800Y”的行:
进行判断,如果800Y区域和800X区域有重合,则舍去;如何没有重合则将其写入b.txt,过滤掉,不写入b.txt。

最后字符串为“800X”的行,都写入在b.txt文档的尾部
其他的行直接读取写入b.txt。

新建a.txt文档,将一下内容copy进a.txt。通上述 4步骤

import os
import numpy as np
# filepath = "C:/Users/xujun/Desktop/front_img/002_012003_120449001.txt"
# outpath = "C:/Users/xujun/Desktop/front_img/bbb.txt"

# 判断一个点是否在一个多边形区域内(射线法),如果在则返回值为True,如果不在则返回值为 False
def isRayIntersectsSegment(poi,s_poi,e_poi): #[x,y] [lng,lat]
    #输入:判断点,边起点,边终点,都是[lng,lat]格式数组
    if s_poi[1]==e_poi[1]: #排除与射线平行、重合,线段首尾端点重合的情况
        return False
    if s_poi[1]>poi[1] and e_poi[1]>poi[1]: #线段在射线上边
        return False
    if s_poi[1]<poi[1] and e_poi[1]<poi[1]: #线段在射线下边
        return False
    if s_poi[1]==poi[1] and e_poi[1]>poi[1]: #交点为下端点,对应spoint
        return False
    if e_poi[1]==poi[1] and s_poi[1]>poi[1]: #交点为下端点,对应epoint
        return False
    if s_poi[0]<poi[0] and e_poi[1]<poi[1]: #线段在射线左边
        return False

    xseg=e_poi[0]-(e_poi[0]-s_poi[0])*(e_poi[1]-poi[1])/(e_poi[1]-s_poi[1]) #求交
    if xseg<poi[0]: #交点在射线起点的左侧
        return False
    return True  #排除上述情况之后

# 判断一个点是否在一个多边形区域内(射线法),如果在则返回值为True,如果不在则返回值为 False
def isPoiWithinPoly(poi,poly):
    #输入:点,多边形三维数组
    #poly=[[[x1,y1],[x2,y2],……,[xn,yn],[x1,y1]],[[w1,t1],……[wk,tk]]] 三维数组

    #可以先判断点是否在外包矩形内
    #if not isPoiWithinBox(poi,mbr=[[0,0],[180,90]]): return False
    #但算最小外包矩形本身需要循环边,会造成开销,本处略去
    sinsc=0 #交点个数
    for epoly in poly: #循环每条边的曲线->each polygon 是二维数组[[x1,y1],…[xn,yn]]
        for i in range(len(epoly)-1): #[0,len-1]
            s_poi=epoly[i]
            e_poi=epoly[i+1]
            if isRayIntersectsSegment(poi,s_poi,e_poi):
                sinsc+=1 #有交点就加1

    return True if sinsc%2==1 else  False



def find_800x_contours(filepath):
    contours_800x = []
    context_800x = []
    with open(filepath, "r") as file1:  # 打开读取文件
        for line in file1:
            nums = line.split(';')
            vertices = np.asarray(nums[1:-2], dtype=int)
            nvertices = len(vertices) / 2
            assert np.mod(nvertices, 1) == 0
            vertices = vertices.reshape(int(nvertices), 2)
            if nums[-2] == '800X':
                contours_800x.append(vertices)
                context_800x.append(line)
    return contours_800x,context_800x


input = 'C:/Users/xujun/Desktop/front_img/annotations'
output = 'C:/Users/xujun/Desktop/front_img/annotations_sort_2'
num = 1
for filename in os.listdir(input):
    filepath = os.path.join(input,filename)   #输入文件
    outpath = os.path.join(output,filename)   #输出文件
    print ('filepath: ', filepath, num)
    print ('outpath: ', outpath, num)
    print ('*******************************************')

    contours_800x,context_800x = find_800x_contours(filepath)
    with open(filepath, "r") as file1:   #打开读取文件
        for line in file1:
            if not os.path.exists(outpath):
                open(outpath,'w')
            with open(outpath, "r+") as file2:
                content = file2.read()
                nums = line.split(';')

                if nums[-2] == '8XXX':  # 写入txt头部操作
                    file2.seek(0)
                    file2.write(line)
                    file2.write(content)
                elif nums[-2] == '800Y':  # 过滤操作
                    vertices = np.asarray(nums[1:-2], dtype=int)
                    nvertices = len(vertices) / 2
                    assert np.mod(nvertices, 1) == 0
                    vertices = vertices.reshape(int(nvertices), 2)
                    # print ('#################################')
                    sign = False  # 设置 标记
                    for point in vertices:  # 遍历所有的点,如果有一个点在区域内,则 tick=True,最后 sign就会被置 1
                        tick = isPoiWithinPoly(point, contours_800x)
                        sign = sign or tick
                    if sign == False:
                        file2.write(line)
                    else:
                        continue
                elif nums[-2] == '800X':
                    continue
                else:
                    file2.write(line)
    with open(outpath,'a') as file2:
        for context in context_800x:
            file2.write(context)

    num += 1