Hướng dẫn python group files by name - tệp nhóm python theo tên

Tôi khá mới với Python, nhưng tôi có rất nhiều kinh nghiệm với Matlab & C.

Những gì tôi cần làm nó phân tích các tên tệp của các tệp trong một thư mục cụ thể, tách chúng thành các nhóm theo các trường trong tên tệp và thực hiện các hoạt động trong các nhóm này.

Cụ thể, tên tệp là:

PROJECT-x-SUBJECT-x-SESSION-x-TYPE.extension

trong đó '-x-' đã được chèn một cách cố tình như là bộ chia trường. Tôi cần thực hiện các hoạt động trên mỗi nhóm các tệp có cùng thành phần Project-X-Sub-Sub-X-session.

_______ Tôi cố gắng tốt nhất theo sau: ________________

Tôi có thể phân tích từng tệp một lần bởi:

dirList=os.listdir(directory)
for fname in dirList:  
    # kill extension
    ext = os.path.splitext(fname)
    # get the 4 fields 
    labels=ext[0].split('-x-')
    PROJECT_list.append(labels[0])
    SUBJECT_list.append(labels[1])
    ...

... Điều này phản ánh ý tưởng duy nhất này tôi đã có về cách sắp xếp các công cụ này: bằng cách tạo 4 danh sách và nối lại chúng cho mỗi tên tệp.

Sau đó với danh sách 4 (đặt hàng?) Của tôi, sau đó tôi có thể gọi một cái gì đó như:

from collections import Counter
c=Counter(SESSION_list) 
list(c)

Sau đó, ít nhất tôi có một danh sách độc đáo các tên phiên

Đề xuất? Tôi có thể tiếp tục, nhưng vì tôi thực sự chỉ cần một điểm khởi đầu, tôi nghĩ rằng điều này là đủ.

Cảm ơn các bạn.

Tôi có một số lớp tính năng đa giác trong bộ dữ liệu địa lý. Tên tệp như dưới đây:

e.g. IHO1a_xxx-xxxx_ALB,IHO1b_xxx-xxxx_MBES_10m, IHO1b_xxx-xxxx_MBES_2m

Tôi muốn nhận được một tập lệnh Python sẽ chọn tất cả các tệp bắt đầu với chính xác 14 ký tự đầu tiên trong tên tệp và hợp nhất chúng.

import os,arcpy

# Define location of .gdb
arcpy.env.workspace = "D:\Users\Documents\H-11_Documents for   Reports_Paul\Test_Model_Builder\ICP_Intermediate.gdb\Deliveryxx_Clipped_Po        lygons" 

#Make workspace a variable
workspace = arcpy.env.workspace

List = []

for dirpath, dirnames, filenames in arcpy.da.Walk(workspace, datatype="FeatureClass", type = "Polygon"):
    for filename in filenames:
        if filename.startswith(filename[0:13]):
            List.append(os.path.join(dirpath, filename))
print List
arcpy.Merge_management([filename,filename], 'D:\Users\cadetpn\Documents\H-11_Documents for Reports_Paul\Test_Model_Builder\Temp.gdb\Temp_Data\merge%n%')

##To keep console window open
raw_input("Press enter to exit...")

Polygeo ♦

64.2K27 Huy hiệu vàng101 Huy hiệu bạc315 Huy hiệu đồng27 gold badges101 silver badges315 bronze badges

Hỏi ngày 6 tháng 8 năm 2016 lúc 12:09Aug 6, 2016 at 12:09

5

Python's

dirList=os.listdir(directory)
for fname in dirList:  
    # kill extension
    ext = os.path.splitext(fname)
    # get the 4 fields 
    labels=ext[0].split('-x-')
    PROJECT_list.append(labels[0])
    SUBJECT_list.append(labels[1])
    ...
0 rất phù hợp với loại nhiệm vụ này-trong thực tế, nó là một lớp để nhóm theo chuỗi tìm kiếm. Ví dụ:

import itertools

test = ['IHO1a_xxx-abcd_ALB',
'IHO1a_xxx-abcd_ALB',
'IHO1a_xxx-abcd_ALB',
'IHO1b_xxx-1234_ALB',
'IHO1c_xxx-dcba_ALB',
'IHO1b_xxx-aaaa_ALB',
'IHO1b_xxx-1234_ALB']

groups =  [list(g) for _, g in itertools.groupby(sorted(test), lambda x: x[0:5])]

>>> groups
[['IHO1a_xxx-abcd_ALB', 'IHO1a_xxx-abcd_ALB', 'IHO1a_xxx-abcd_ALB'],
 ['IHO1b_xxx-1234_ALB', 'IHO1b_xxx-1234_ALB', 'IHO1b_xxx-aaaa_ALB'],
 ['IHO1c_xxx-dcba_ALB']]

Sau đó chỉ đơn giản là lặp lại các nhóm của bạn và thực hiện hợp nhất.

Đã trả lời ngày 6 tháng 8 năm 2016 lúc 14:42Aug 6, 2016 at 14:42

Hướng dẫn python group files by name - tệp nhóm python theo tên

Aaron ♦ AaronAaron

50.6K25 Huy hiệu vàng146 Huy hiệu bạc 305 Huy hiệu Đồng25 gold badges146 silver badges305 bronze badges

4

Một phương pháp khác, không phải một dòng mặc dù nhưng không cần nhập bất cứ thứ gì. Loại tốt nếu bạn cần gọi một nhóm cụ thể bất cứ lúc nào sau này trong thời gian thường xuyên.

test = ['IHO1a_xxx-abcd_ALB',
'IHO1a_xxx-abcd_ALB',
'IHO1a_xxx-abcd_ALB',
'IHO1b_xxx-1234_ALB',
'IHO1c_xxx-dcba_ALB',
'IHO1b_xxx-aaaa_ALB',
'IHO1b_xxx-1234_ALB']

dictionary = {}
for x in test:
    group = dictionary.get(x[:5],[])
    group.append(x)
    dictionary[x[:5]] = group

for value in dictionary.itervalues():
    #do the merge here
    print value

['IHO1a_xxx-abcd_ALB', 'IHO1a_xxx-abcd_ALB', 'IHO1a_xxx-abcd_ALB']
['IHO1b_xxx-1234_ALB', 'IHO1b_xxx-aaaa_ALB', 'IHO1b_xxx-1234_ALB']
['IHO1c_xxx-dcba_ALB']

Đã trả lời ngày 7 tháng 8 năm 2016 lúc 23:55Aug 7, 2016 at 23:55

Hướng dẫn python group files by name - tệp nhóm python theo tên

2

Có một số vấn đề trong mã của bạn. Ví dụ, dòng này:

dirList=os.listdir(directory)
for fname in dirList:  
    # kill extension
    ext = os.path.splitext(fname)
    # get the 4 fields 
    labels=ext[0].split('-x-')
    PROJECT_list.append(labels[0])
    SUBJECT_list.append(labels[1])
    ...
1

Dòng này là không cần thiết bởi vì nó đang kiểm tra xem chính nó có bắt đầu với 14 ký tự đầu tiên của chính nó không, vì vậy tôi đã bỏ qua nó.

Thử cái này:

import os, arcpy, fnmatch

# Define location of .gdb
arcpy.env.workspace  = r"D:\Users\Documents\H-11_Documents for Reports_Paul\Test_Model_Builder\ICP_Intermediate.gdb\Deliveryxx_Clipped_Polygons"

#Make workspace a variable
workspace = arcpy.env.workspace

List = []

for dirpath, dirnames, filenames in arcpy.da.Walk(workspace, datatype="FeatureClass", type="Polygon"):
    for filename in filenames:
        List.append(os.path.join(dirpath, filename))


# now find the unique patterns
patterns = set([os.path.basename(fl)[:5] for fl in List])

# now loop through List again and merge those that match pattern
for pattern in patterns:
    group = [fl for fl in List if fnmatch.fnmatch(fl, '*' + pattern + '*')]
    arcpy.Merge_management(group, r'D:\Users\cadetpn\Documents\H-11_Documents for Reports_Paul\Test_Model_Builder\Temp.gdb\Temp_Data\merge_{}'.format('pattern'))

##To keep console window open
raw_input("Press enter to exit...")

Ngoài ra, tôi khuyên bạn nên không có khoảng trống trong tên thư mục của bạn.

Đã trả lời ngày 6 tháng 8 năm 2016 lúc 14:31Aug 6, 2016 at 14:31

Hướng dẫn python group files by name - tệp nhóm python theo tên

CRMACKEYCRMACKEYcrmackey

8.43417 Huy hiệu bạc33 Huy hiệu đồng17 silver badges33 bronze badges

0