Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 读取文本文件,操作字符串并以特定格式导出csv_Python_Python 3.x_List_Csv - Fatal编程技术网

Python 读取文本文件,操作字符串并以特定格式导出csv

Python 读取文本文件,操作字符串并以特定格式导出csv,python,python-3.x,list,csv,Python,Python 3.x,List,Csv,我正在尝试读取一个具有一些时髦格式的文本文件,处理一些字符串并导出一个csv文件。导入文本是多边形和坐标的列表,导出文本是具有唯一ID的坐标列表。我一直在努力使代码对于不同长度的多边形和不同数量的多边形具有灵活性。 列表示例: ['poly', '1', '317806.6570985045', '4312355.239299678', '317808.2079078924', '4312354.675368992', '317806.1871562657', '4312348.75409678

我正在尝试读取一个具有一些时髦格式的文本文件,处理一些字符串并导出一个csv文件。导入文本是多边形和坐标的列表,导出文本是具有唯一ID的坐标列表。我一直在努力使代码对于不同长度的多边形和不同数量的多边形具有灵活性。 列表示例:

['poly', '1', '317806.6570985045', '4312355.239299678', '317808.2079078924', '4312354.675368992', '317806.1871562657', '4312348.754096784', '317804.4953642061', '4312349.365021695', 'poly', '2', '317811.4975035638', '4312361.724502574', '317810.651607534', '4312362.006467917', '317809.3357692654', '4312358.199935783', '317810.3226479669', '4312357.917970439']
输出csv的示例:

poly1A, 317806.6570985045, 4312355.239299678
poly1B, 317808.2079078924, 4312354.675368992
poly1C, 317806.1871562657, 4312348.754096784
poly2A, 317811.4975035638, 4312361.724502574
到目前为止,我已经清理了input.txt,并有了相关信息的列表。我在列表中循环并计算“多边形”出现的次数,以知道将有多少个多边形。我一直在研究如何在列表中循环,并计算多边形之间的坐标集数量,以便知道从列表中的何处将它们剪切到新列表中,同时保持不同大小多边形的灵活性。到目前为止,我的代码是:

with open("Polys.txt", "r") as in_file, open("csvout.csv", 'w') as out_file:
    lines_list = in_file.readlines()
    del lines_list[0:5]
    #print(lines_list[])
    poly_list = []
    for i in range(len(lines_list)):
        poly_list.append(lines_list[i].strip('\n'))
    poly_list_strip = []
    for i in range(len(poly_list)):
        poly_list_strip.append(poly_list[i].strip())
    poly_list_untab =[]
    for i in range(len(poly_list_strip)):
        poly_list_untab.append(poly_list_strip[i].split())
    #print(poly_list_untab)
    flat_poly_list = [val for sublist in poly_list_untab for val in sublist]
    poly_index = [i for i, x in enumerate(flat_poly_list) if x == 'poly']
    poly_comb = flat_poly_list[]

如果我正确理解所需的输出,您可以使用以下方法
list_to_csv(l,n)
调用时使用
l
表示问题中的字符串列表,而
n
表示多边形的长度。如果要在同一列表中说明不同大小的多边形,则需要某种方法来识别

import string
import csv

chars = string.ascii_uppercase

def isplit(iterable,splitters):
    """https://stackoverflow.com/a/4322780/12366110"""
    return [list(g) for k,g in itertools.groupby(iterable,lambda x:x in splitters) if not k]

def chunks(lst, n):
    """https://stackoverflow.com/a/312464/12366110"""
    for i in range(0, len(lst), n):
        yield lst[i:i + n]

def list_to_csv(l, n):
    split = [(f"poly{x[0]}{chars[i]}", *chunk) for x in isplit(l, 'poly') for i, chunk in enumerate(chunks(x[1:], n))]
    with open('csvout.csv','w',newline='') as f:
        csv_out=csv.writer(f)
        csv_out.writerow(['name', *[f"coord{x}" for x in range(n)]])
        for row in split:
            csv_out.writerow(row)
用法:

>>> l = ['poly', '1', '317806.6570985045', '4312355.239299678', '317808.2079078924', '4312354.675368992', '317806.1871562657', '4312348.754096784', '317804.4953642061', '4312349.365021695', 'poly', '2', '317811.4975035638', '4312361.724502574', '317810.651607534', '4312362.006467917', '317809.3357692654', '4312358.199935783', '317810.3226479669', '4312357.917970439']
>>> list_to_csv(l, 2)
name,coord0,coord1
poly1A,317806.6570985045,4312355.239299678
poly1B,317808.2079078924,4312354.675368992
poly1C,317806.1871562657,4312348.754096784
poly1D,317804.4953642061,4312349.365021695
poly2A,317811.4975035638,4312361.724502574
poly2B,317810.651607534,4312362.006467917
poly2C,317809.3357692654,4312358.199935783
poly2D,317810.3226479669,4312357.917970439
输出:

>>> l = ['poly', '1', '317806.6570985045', '4312355.239299678', '317808.2079078924', '4312354.675368992', '317806.1871562657', '4312348.754096784', '317804.4953642061', '4312349.365021695', 'poly', '2', '317811.4975035638', '4312361.724502574', '317810.651607534', '4312362.006467917', '317809.3357692654', '4312358.199935783', '317810.3226479669', '4312357.917970439']
>>> list_to_csv(l, 2)
name,coord0,coord1
poly1A,317806.6570985045,4312355.239299678
poly1B,317808.2079078924,4312354.675368992
poly1C,317806.1871562657,4312348.754096784
poly1D,317804.4953642061,4312349.365021695
poly2A,317811.4975035638,4312361.724502574
poly2B,317810.651607534,4312362.006467917
poly2C,317809.3357692654,4312358.199935783
poly2D,317810.3226479669,4312357.917970439

如果我正确理解所需的输出,您可以使用以下方法
list_to_csv(l,n)
调用时使用
l
表示问题中的字符串列表,而
n
表示多边形的长度。如果要在同一列表中说明不同大小的多边形,则需要某种方法来识别

import string
import csv

chars = string.ascii_uppercase

def isplit(iterable,splitters):
    """https://stackoverflow.com/a/4322780/12366110"""
    return [list(g) for k,g in itertools.groupby(iterable,lambda x:x in splitters) if not k]

def chunks(lst, n):
    """https://stackoverflow.com/a/312464/12366110"""
    for i in range(0, len(lst), n):
        yield lst[i:i + n]

def list_to_csv(l, n):
    split = [(f"poly{x[0]}{chars[i]}", *chunk) for x in isplit(l, 'poly') for i, chunk in enumerate(chunks(x[1:], n))]
    with open('csvout.csv','w',newline='') as f:
        csv_out=csv.writer(f)
        csv_out.writerow(['name', *[f"coord{x}" for x in range(n)]])
        for row in split:
            csv_out.writerow(row)
用法:

>>> l = ['poly', '1', '317806.6570985045', '4312355.239299678', '317808.2079078924', '4312354.675368992', '317806.1871562657', '4312348.754096784', '317804.4953642061', '4312349.365021695', 'poly', '2', '317811.4975035638', '4312361.724502574', '317810.651607534', '4312362.006467917', '317809.3357692654', '4312358.199935783', '317810.3226479669', '4312357.917970439']
>>> list_to_csv(l, 2)
name,coord0,coord1
poly1A,317806.6570985045,4312355.239299678
poly1B,317808.2079078924,4312354.675368992
poly1C,317806.1871562657,4312348.754096784
poly1D,317804.4953642061,4312349.365021695
poly2A,317811.4975035638,4312361.724502574
poly2B,317810.651607534,4312362.006467917
poly2C,317809.3357692654,4312358.199935783
poly2D,317810.3226479669,4312357.917970439
输出:

>>> l = ['poly', '1', '317806.6570985045', '4312355.239299678', '317808.2079078924', '4312354.675368992', '317806.1871562657', '4312348.754096784', '317804.4953642061', '4312349.365021695', 'poly', '2', '317811.4975035638', '4312361.724502574', '317810.651607534', '4312362.006467917', '317809.3357692654', '4312358.199935783', '317810.3226479669', '4312357.917970439']
>>> list_to_csv(l, 2)
name,coord0,coord1
poly1A,317806.6570985045,4312355.239299678
poly1B,317808.2079078924,4312354.675368992
poly1C,317806.1871562657,4312348.754096784
poly1D,317804.4953642061,4312349.365021695
poly2A,317811.4975035638,4312361.724502574
poly2B,317810.651607534,4312362.006467917
poly2C,317809.3357692654,4312358.199935783
poly2D,317810.3226479669,4312357.917970439